如何从 Java 中的 Google 驱动器 API 获取 Gdoc 内容?

How to get Gdoc content from Google Drive API in Java?

我正在尝试使用 Google 驱动器 API 获取 Google 文档的内容。我成功获取了文件夹并获得了 Google 文档文件 ID。

在API文档上,据说我可以下载这样一个文件:

private String getGdoc(String id) throws Exception {
        if(service == null) throw new Exception();
        OutputStream outputStream = new ByteArrayOutputStream();
        service.files().export(id, "text/plain")
            .executeMediaAndDownloadTo(outputStream);
        
        return null;
    }

我的问题是我不想将它写入带有 OutputStream 的文件,但我想将文件的内容写入 String

所以我尝试使用 InputStream :

private String getGdoc(String id) throws Exception {
        if(service == null) throw new Exception();
        InputStream inputStream = service.files().export(id, "text/plain")
            .executeMediaAsInputStream();
        
        System.out.println(IOUtils.toString(inputStream, StandardCharsets.UTF_8));
        
        return null;
    }

通过 InputStream 我得到了文件的内容,但是我的文档中有一些日文字符,但它们没有显示出来。对于控制台中的这些日语字符,我只得到 ?。我不知道它来自哪里,因为我指定使用 UTF-8 字符集。

当我尝试用 OutputStream 写入 txt 文件时,我没有遇到任何字符无法识别的问题。

我不知道实现该目标的最佳方法是什么。你能帮帮我吗?

google驱动器api是一个文件存储api。它可以让您上传和下载存储在 google 驱动器中的文件。下载文件时,您会将其保存到您的计算机上,然后在第三方应用程序中打开它。

如果您想检查和操作存储在 Google 驱动器上的 google 文档文件的内容。您应该考虑使用 Google docs api

Google Docs Java quickstart

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.docs.v1.Docs;
import com.google.api.services.docs.v1.DocsScopes;
import com.google.api.services.docs.v1.model.Document;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.GeneralSecurityException;
import java.util.Collections;
import java.util.List;

public class DocsQuickstart {
    private static final String APPLICATION_NAME = "Google Docs API Java Quickstart";
    private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
    private static final String TOKENS_DIRECTORY_PATH = "tokens";
    private static final String DOCUMENT_ID = "195j9eDD3ccgjQRttHhJPymLJUCOUjs-jmwTrekvdjFE";

    /**
     * Global instance of the scopes required by this quickstart.
     * If modifying these scopes, delete your previously saved tokens/ folder.
     */
    private static final List<String> SCOPES = Collections.singletonList(DocsScopes.DOCUMENTS_READONLY);
    private static final String CREDENTIALS_FILE_PATH = "/credentials.json";

    /**
     * Creates an authorized Credential object.
     * @param HTTP_TRANSPORT The network HTTP Transport.
     * @return An authorized Credential object.
     * @throws IOException If the credentials.json file cannot be found.
     */
    private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
        // Load client secrets.
        InputStream in = DocsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
        if (in == null) {
            throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
        }
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

        // Build flow and trigger user authorization request.
        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
                HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
                .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
                .setAccessType("offline")
                .build();
        LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
        return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
    }

    public static void main(String... args) throws IOException, GeneralSecurityException {
        // Build a new authorized API client service.
        final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
        Docs service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
                .setApplicationName(APPLICATION_NAME)
                .build();

        // Prints the title of the requested doc:
        // https://docs.google.com/document/d/195j9eDD3ccgjQRttHhJPymLJUCOUjs-jmwTrekvdjFE/edit
        Document response = service.documents().get(DOCUMENT_ID).execute();
        String title = response.getTitle();

        System.out.printf("The title of the doc is: %s\n", title);
    }
}