我使用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();
}
}
答案 0 :(得分:1)
首先,C:\googletest\drive\
不是网址。它是文件系统路径名。
接下来,以下内容可能与您的想法无关:
byte[] buffer = new byte[bufferedInputStream.available()];
问题是available()
调用可以返回零...对于非空流。 available()
返回的值是估计值当前可用于读取的字节数。这不一定是流长度......或与之相关的任何内容。事实上,即使有数据需要读取,某些设备始终的设备驱动程序也会返回零。
最后,这是错误的:
while( bufferedInputStream.read(buffer) != -1) {
bufferedOutputStream.write(buffer);
您假设read
返回-1
表示填充缓冲区。事实并非如此。任何一个read
调用都可以返回部分完整的缓冲区。但是然后你将整个缓冲区内容写入输出流......包括" junk"从以前的读物。
第二个和第三个问题中的任何一个或两个都可能导致文件损坏。事实上,第三个可能到。