gpt4 book ai didi

android - Google Drive & Android - 读取失败 : EBADF (Bad file number)

转载 作者:搜寻专家 更新时间:2023-11-01 09:40:08 26 4
gpt4 key购买 nike

所以我有一段代码可以在我可以访问的所有设备和模拟器上正常工作,除了一个。这是一款廉价的旧 Android 设备,Huawei Y330-U01,运行 4.2.2。我正在使用 com.google.android.gms:play-services-drive:9.8.0 进行编译。据我所知,这绝对是标准的。

我得到了一个超过 1 兆字节的纯文本文件,我可以一个字符一个字符地读取它,几千个字符(数量各不相同,而不是在 2 的幂或任何数字之间),然后得到错误

IOException while testing the stream's first character
java.io.IOException: read failed: EBADF (Bad file number)
at libcore.io.IoBridge.read(IoBridge.java:486)
at java.io.FileInputStream.read(FileInputStream.java:179)
at libcore.io.Streams.readSingleByte(Streams.java:41)
at java.io.FileInputStream.read(FileInputStream.java:175)
at com.suchideas.android.alamode.sync.SyncActivity$b.run(Unknown Source)
Caused by: libcore.io.ErrnoException: read failed: EBADF (Bad file number)
at libcore.io.Posix.readBytes(Native Method)
at libcore.io.Posix.read(Posix.java:123)
at libcore.io.BlockGuardOs.read(BlockGuardOs.java:149)
at libcore.io.IoBridge.read(IoBridge.java:476)
at java.io.FileInputStream.read(FileInputStream.java:179) 
at libcore.io.Streams.readSingleByte(Streams.java:41) 
at java.io.FileInputStream.read(FileInputStream.java:175) 
at com.suchideas.android.alamode.sync.SyncActivity$b.run(Unknown Source) 

我非常有信心这就像用完 RAM 或磁盘空间(肯定足够这个文件的空间,数百兆字节,但设备确实喜欢提示关于存储)并清除实际使用的东西。再次重申,此代码在相同 Android 版本的模拟器和所有其他经过测试的设备上完美运行

所以。您认为有解决办法吗?

这是代码,您应该能够填补空白...

if (!mGoogleApiClient.isConnected()) {
mGoogleApiClient.connect();
while (mGoogleApiClient.isConnecting()) {
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (!mGoogleApiClient.isConnected())
return;
}

appFolder = Drive.DriveApi.getAppFolder(mGoogleApiClient);
Query query = new Query.Builder()
.addFilter(Filters.eq(SearchableField.TITLE, UPLOADED_DATABASE_NAME))
.build();
DriveApi.MetadataBufferResult metadataBufferResult = appFolder.queryChildren(mGoogleApiClient, query).await();
if (!metadataBufferResult.getStatus().isSuccess()) {
metadataBufferResult.release();
return;
}

MetadataBuffer databaseFileResults = metadataBufferResult.getMetadataBuffer();
if (databaseFileResults.getCount() == 0) {
return;
}
Metadata md = databaseFileResults.get(0);
Log.d(TAG, "Database file retrieved [" + md.getFileSize() + "B]. Created " + md.getCreatedDate() + ", modified " + md.getModifiedDate() + ".");
DriveId databaseFileID = md.getDriveId();
databaseFileResults.release();
metadataBufferResult.release();

DriveFile databaseFile = databaseFileID.asDriveFile();
DriveApi.DriveContentsResult driveContentsResult = databaseFile.open(mGoogleApiClient, DriveFile.MODE_READ_ONLY, new DriveFile.DownloadProgressListener() {
@Override
public void onProgress(long downloaded, long expected) {

}
}).await();
if (!driveContentsResult.getStatus().isSuccess()) {
return;
}
DriveContents driveContents = driveContentsResult.getDriveContents();

InputStream in = driveContents.getInputStream();

try {
int c = 0;
for(int i = 0; true; i++) {
c = in.read();
if(c == -1) break;
Log.d(TAG, "Character "+i+": "+(char)c);
}
} catch (IOException e) {
Log.e(TAG, "IOException while testing the stream character", e);
return;
}

最佳答案

好吧,几乎肯定可以做得比这更好(我不认为你需要逐个字符地阅读,一些缓冲可能没问题),但经过几个小时的战斗,我找到了一种避免触发的方法此设备上的问题。

在实践中,我建议先尝试正常的 driveContents.getInputStream()。这样就可以捕获上面讨论的那种错误,并且只有在必要时才转向这种方法。

但它有效。

方法:直接从FileDescriptor 打开DriveContents,而不是通过InputStream。逐渐在缓冲区中构建它(我只是在这里使用 StringBuilder,因为这是概念验证)。捕获 IOExceptions,如果您至少成功读取了 一些 数据,请重新开始,并继续,直到到达字符串的末尾。

private static String safeDriveFileToString(DriveContents driveContents) throws IOException {
StringBuilder sb = new StringBuilder();

InputStream in;

int n = 0, nPrevious = 0;
while(true) {
in = new FileInputStream(driveContents.getParcelFileDescriptor().getFileDescriptor());
try {
int toSkip = n;
while(toSkip > 0) {
toSkip -= in.skip(toSkip);
}

int c;
while ((c = in.read()) != -1) {
sb.append((char) c);
n++;
}

if(c == -1) break;
} catch (IOException e) {
if(nPrevious == n) {
throw e;
} else {
Log.e(TAG, "Ignoring error part-way through a file:", e);
}
nPrevious = n;
}
}

return sb.toString();
}

想知道最奇怪的事情吗?在用这种方法读过一次这个文件后,它现在总是可以工作而不需要求助于这个。 绝对奇怪。

关于android - Google Drive & Android - 读取失败 : EBADF (Bad file number),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40368113/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com