相关疑难解决方法(0)

814
推荐指数
15
解决办法
90万
查看次数

当我需要使用它2次时,如何重新打开已关闭的InputStream

我目前正在使用InpuStream从我的服务器获取JSON响应.

我需要做两件事:

  1. 解析它并在屏幕上显示值
  2. 将此Feed保存在SDCard文件中

在逐个使用这两种方法时,这完全没有问题.

使用GSON进行解析:

Gson gson = new Gson();
Reader reader = new InputStreamReader (myInputStream);
Result result = gson.FrmJson(reader, Result.class)
Run Code Online (Sandbox Code Playgroud)

并将复制到SDCard

FileOutputStream f (...) f.write (buffer)
Run Code Online (Sandbox Code Playgroud)

它们都经过了测试.

问题是一旦解析完成,我想写入SDCard并且它会中断.我知道我的InputStream已关闭,这就是问题所在.

这里有一些接近我的问题:如何缓存InputStream以供多次使用

有没有办法改进该解决方案并提供我们可以使用的东西?

java android inputstream

16
推荐指数
1
解决办法
2万
查看次数

无论markSupported()如何,都要使InputStream读取多次

我需要能够重复使用java.io.InputStream多次,并且我认为以下代码可以工作,但它只能在第一次使用.


public class Clazz
{
  private java.io.InputStream dbInputStream, firstDBInputStream;
  private ArrayTable db;

  public Clazz(java.io.InputStream defDB)
  {
    this.firstDBInputStream = defDB;
    this.dbInputStream = defDB;
    if (db == null)
      throw new java.io.FileNotFoundException("Could not find the database at " + db);
    if (dbInputStream.markSupported())
      dbInputStream.mark(Integer.MAX_VALUE);
    loadDatabaseToArrayTable();
  }

  public final void loadDatabaseToArrayTable() throws java.io.IOException
  {
    this.dbInputStream = firstDBInputStream;
    if (dbInputStream.markSupported())
      dbInputStream.reset();

    java.util.Scanner fileScanner = new java.util.Scanner(dbInputStream);
    String CSV = "";
    for (int i = 0; fileScanner.hasNextLine(); i++)
      CSV += fileScanner.nextLine() + "\n";
    db …
Run Code Online (Sandbox Code Playgroud)

java io inputstream

10
推荐指数
1
解决办法
3万
查看次数

读取输入流两次而不将其存储在内存中

参考stackoverflow问题,据说InputStream可以使用或通过使用来多次读取mark()reset()提供.InputStreamPushbackInputStream

在所有这些情况下,流的内容存储在字节数组中(即,文件的原始内容存储在主存储器中)并重复使用多次.

当文件大小超过内存大小时会发生什么?我认为这可能会铺平道路OutOfMemoryException.

有没有更好的方法多次读取流内容而不在本地存储流内容(即;在主存储器中)?

知道这个,请帮帮我.提前致谢.

java inputstream stream pushbackinputstream

5
推荐指数
1
解决办法
3701
查看次数

从 Android USB 配件读取数据的更好方法

我正在用 Java 编写一个 Android 应用程序,该应用程序使用 Android 配件 API 与 USB 配件进行通信。

谷歌文档并没有给出实际读取和写入数据,只是如何打开附件进行通信的例子。

它还说明了两件事:

  1. 通信应该在后台线程中完成,而不是在 UI 线程上。
  2. 读取缓冲区的长度应至少为 16384 字节,因为这是 Android Open Accessory 协议的最大消息长度。

我实现了这样的阅读:

/** boiler plate from example docs: **/
fileDescriptor = usbManager.openAccessory(accessory);

if (fileDescriptor != null) {
    FileDescriptor fd = fileDescriptor.getFileDescriptor();
    inputStream = new FileInputStream(fd);
    readBuffer = new byte[16384];
    // ... some more code that is not relevant for reading data ... //
}

/** my code in separate thread: **/

int read;

while ((read = …
Run Code Online (Sandbox Code Playgroud)

java usb android accessory

5
推荐指数
0
解决办法
427
查看次数

如何在调用IOUtils.copy后重新读取InputStream?

我只是用

IOUtils.copy(myInputStream, myOutputStream);
Run Code Online (Sandbox Code Playgroud)

我在调用IOUtils.copy之前看到输入流可以读取而不是之后.

flux.available()
     (int) 1368181 (before)
     (int) 0 (after)
Run Code Online (Sandbox Code Playgroud)

我看到了这方面的一些解释,我看我可以复制 bytes从我InputStreamByteArrayInputStream,然后用mark(0)read(),以多次读取的输入流.

这是得到的代码(正在运行).我发现这段代码非常冗长,如果有更好的解决方案,我想要这样做.

ByteArrayInputStream fluxResetable = new ByteArrayInputStream(IOUtils.toByteArray(myInputStream));
fluxResetable.mark(0);
IOUtils.copy(fluxResetable, myOutputStream);
fluxResetable.reset();
Run Code Online (Sandbox Code Playgroud)

java inputstream

1
推荐指数
1
解决办法
3446
查看次数

无法两次读取相同的InputStream

我有一个InputStream作为参数,当我第一次读取它时它工作得很好,但是,读取相同的InputStream不起作用。我就是无法mark()上班reset()。有人知道如何重置这个吗?我正在读取 .txt 文件。该文件包含不会重新出现的敌方对象的生成值,因为输入流标记(?)位于末尾,我猜?

readTxt(InputStream resource){
//resource is a .txt as ResourceStream
arrayList = new BufferedReader(new InputStreamReader(resource,
                StandardCharsets.UTF_8)).lines().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

java inputstream

1
推荐指数
1
解决办法
1万
查看次数