0

我使用java驱动api中的“get”方法,我可以得到输入流。但是当我使用输入流创建文件时,我无法打开文件。它喜欢文件坏了。

private static String fileurl = "C:\\googletest\\drive\\";

public static void newFile(String filetitle, InputStream stream) throws IOException {
    String filepath = fileurl + filetitle;      
    BufferedInputStream bufferedInputStream=new BufferedInputStream(stream);
    byte[] buffer = new byte[bufferedInputStream.available()];


    File file = new File(filepath);
    if (!file.exists()) {
        file.getParentFile().mkdirs();

        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(filepath));
          while( bufferedInputStream.read(buffer) != -1) { 
              bufferedOutputStream.write(buffer);
      }  
          bufferedOutputStream.flush();
          bufferedOutputStream.close();
    }
}
4

1 回答 1

1

首先,C:\googletest\drive\不是 URL。它是一个文件系统路径名。

接下来,以下内容可能不会像您认为的那样:

  byte[] buffer = new byte[bufferedInputStream.available()];

问题是available()调用可以返回零......对于非空流。返回的值available()是对当前可读取的字节数的估计......现在。这不一定是流长度......或与之相关的任何东西。事实上,某些设备的设备驱动程序始终返回零,即使有数据要读取。

最后,这是错误的:

   while( bufferedInputStream.read(buffer) != -1) { 
          bufferedOutputStream.write(buffer);

您假设read返回-1意味着它填充了缓冲区。事实并非如此。任何一个read调用都可能返回部分已满的缓冲区。但是随后您将整个缓冲区内容写入输出流......包括先前读取的“垃圾”。


第二个和第三个问题中的一个或两个都可能导致文件损坏。事实上,第三个是可能的。

于 2013-04-17T10:05:07.003 回答