标签: fileinputstream

为什么FileInputStream read()没有阻塞?

我有一个Writer程序,它将一行文本写入文件,然后等待用户在写入另一行之前返回,然后退出.只有在那之后文件才关闭.代码:

public class Writer {

    Writer() {
    }

    public static String[] strings = 
        {
            "Hello World", 
            "Goodbye World"
        };

    public static void main(String[] args) 
        throws java.io.IOException {

        java.io.FileOutputStream pw =
            new java.io.FileOutputStream("myfile.txt");

        for(String s : strings) {
            pw.write(s.getBytes());
            System.in.read();
        }

        pw.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

首先开始:

java作家

然后我还有一个读者程序,只要文件的写入尚未完成(即尚未调用pw.close()),应该(我预期)阻止.代码:

public class ReaderFIS extends Object {

    ReaderFIS() {
    }

    public static void main(String[] args) throws Exception {

        java.io.FileInputStream in = new java.io.FileInputStream("myfile.txt");

        int ch = -1;
        while((ch = in.read()) >= 0) {
         System.out.println("ch = …
Run Code Online (Sandbox Code Playgroud)

java file blocking fileinputstream

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

将inputStream转换为FileInputStream?

我遇到了问题 - 我需要从Android APK(例如key.keystore)读取SecretKey,对于我的应用程序,它必须被读取为FileInputStream,但是从资产中我只得到inputStream.如何将inputStream转换为FileInputStream?或者有没有其他方法,如何从文件作为fileInputStream访问文件?

谢谢

android inputstream fileinputstream

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

通过块读取文件块

我想一块一块地读一个文件.该文件被分成几个部分,存储在不同类型的媒体上.我目前所做的是调用文件的每个单独部分,然后将其合并回原始文件.

问题是我需要等到所有块都到达才能播放/打开文件.是否有可能在他们到达时阅读这些块,而不是等待它们全部到达.

我正在处理媒体文件(电影文件).

java io fileinputstream http-chunked

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

FileInputStream.read()什么时候阻止?

问题类似于以下两个问题.

但我仍然无法完全理解它.

到目前为止,我认为以下代码中的read()方法将因空文件'test.txt'而阻塞.

FileInputStream fis = new FileInputStream("c:/test.txt");
System.out.println(fis.read());
System.out.println("to the end");
Run Code Online (Sandbox Code Playgroud)

实际上它会打印-1,我想知道为什么.

javadoc说如果还没有输入,则此方法会阻塞.

什么" 没有输入可用 "是什么意思?

谢谢.

java inputstream blocking fileinputstream java-io

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

如何将 FileInputStream 转换为 S3ObjectInputStream

我想将 File InputStream 转换为 S3ObjectInputStream,我以下面的方式尝试过,但没有成功,我得到了

java.io.FileInputStream cannot be cast to com.amazonaws.services.s3.model.S3ObjectInputStream
Run Code Online (Sandbox Code Playgroud)

这是我的代码

InputStream is = new FileInputStream(file);
S3ObjectInputStream sObject = (S3ObjectInputStream)is;
Run Code Online (Sandbox Code Playgroud)

inputstream amazon-s3 fileinputstream

5
推荐指数
2
解决办法
5990
查看次数

编译器如何有效地优化getline()?

我知道很多编译器的优化可能相当深奥,但我的例子非常简单,我想看看我能理解,如果有人知道它可以做什么.

我有一个500 MB的文本文件.我声明并初始化一个fstream:

std::fstream file(path,std::ios::in)
Run Code Online (Sandbox Code Playgroud)

我需要按顺序读取文件.它的制表符分隔,但字段长度未知,并且逐行变化.我需要对每一行进行的实际解析为总数增加了很少的时间(这真让我感到惊讶,因为我在getline的每一行上都在执行string :: find.我认为这很慢).

一般来说,我想搜索每一行的字符串,并在找到它时中止循环.为了我自己的好奇心,我也增加并吐出了行数,我确认这增加了一点时间(5秒左右),让我看看它是如何吹过短线并在长线上慢下来的.

我将文本作为标记eof的唯一字符串找到,因此需要搜索每一行.我在手机上这样做,所以我为格式化问题道歉,但这非常简单.我有一个函数将我的fstream作为参考,并将文本作为字符串找到并返回std :: size_t.

long long int lineNum = 0;
while (std::getline (file, line))
{
    pos = line.find(text);
    lineNum += 1;
    std::cout << std::to_string(lineNum) << std::endl;
    if (pos != -1) 
        return file.tellg():
 }
     return std::string::npos;
Run Code Online (Sandbox Code Playgroud)

编辑:lingxi指出在这里没有必要使用to_string,谢谢.如上所述,完全省略行号计算和输出可以节省几秒钟,这在我的预优化示例中占总数的一小部分.

这成功地遍历每一行,并在408秒内返回结束位置.尝试将文件放在字符串流中,或者省略整个循环中的所有内容(只是getline直到结束,没有检查,搜索或显示),我的改进很小.为字符串预留一个巨大的空间也无济于事.

似乎getline完全是驱动程序.但是......如果我使用/ O2标志(MSVC++)进行编译,我可以更快地获得26秒.此外,长线与短线没有明显的减速.很明显,编译器正在做一些非常不同的事情.没有我的抱怨,但有任何想法如何实现?作为练习,我想尝试让我的代码在编译器优化之前更快地执行.

我敢打赌它与getline操纵字符串的方式有关.是否更快(唉不能测试一段时间)只保留字符串的整个文件大小,并按字符读取,当我传递一个/ n时增加我的行号?此外,编译器会使用像mmap这样的东西吗?

更新:我今晚回家时会发布代码.看起来只是关闭运行时检查将执行从400秒降低到50秒!我尝试使用原始c样式数组执行相同的功能.我不是很有经验,但很容易将数据转储到字符数组中,并循环查找换行符或目标字符串的第一个字母.

即使在完全调试模式下,它也会在54秒内正确找到字符串.检查关闭26秒,优化20秒.因此,从我的非正式的临时实验看,字符串和流函数是运行时检查的牺牲品?我再次回到家时会再次检查.

c++ optimization fileinputstream

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

FileChannel 在资产文件夹中返回错误的文件大小

我正在尝试File使用FileInputStream.

这就是我创建的方式FileInputStream

AssetManager assetManager = getAssets();
AssetFileDescriptor fileDescriptor = assetManager.openFd(fileName);
FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor());
Run Code Online (Sandbox Code Playgroud)

之后,我试图从File这样的读取数据:

FileChannel fileChannel = inputStream.getChannel();

MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel.size());
IntBuffer intBuffer = mappedByteBuffer.asIntBuffer();

int[] array = new int[intBuffer.limit()];
intBuffer.get(array);

inputStream.close();
fileChannel.close();
Run Code Online (Sandbox Code Playgroud)

但这不起作用。出于某种原因,fileChannel.size()返回了一个巨大的数字。我有一个正好 13 个字节长的测试文件,但fileChannel.size()返回 1126498!此外,如果我忽略大小并开始读取返回的字节,则根本不匹配我的测试文件!

那么这里发生了什么?有没有办法解决这个问题?

java android assets fileinputstream

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

IO java中的Skip()方法?

我知道skip(long)的方法FileInputStream跳过从该文件的起始位置字节,并将文件指针.但是如果我们想在文件中间只跳过20个字符,并且要读取文件的剩余部分,我们应该怎么做?

java io skip fileinputstream

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

我如何读取java中的二进制数据文件

所以我正在为学校做一个项目,我需要在二进制数据文件中读取并使用它为角色制作统计数据,如力量和智慧.它的设置使前8位构成一个统计数据.

我想知道这样做的实际语法是什么.是否像阅读文本文件一样.

File file = new File("CharacterStats.dat");
Scanner inputScanner = new Scanner(file);

inputScanner.next();
Run Code Online (Sandbox Code Playgroud)

java binary fileinputstream

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

使用协程读取和复制文件

我创建了以下应用程序来说明一些疑问。我在 Github 上的示例

在此示例中,我将文件复制到另一个包。

我的疑惑如下:

  1. 并行执行任务,是否可以返回取消之前完成的值?

  2. contentResolver.openInputStream (uri)当我使用 IO 上下文时,为什么会出现“不适当的阻塞方法调用”消息?

  3. 当我读取文件条目以复制到输出时,我总是检查作业状态,以便当取消此任务时,它会立即停止,创建的输出文件被删除并返回取消异常,这是正确的吗?

  4. 我可以限制执行的任务量吗?

我的onCreate:

private val listUri = mutableListOf<Uri>()
private val job = Job()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    
    //get files from 1 to 40
    val packageName = "android.resource://${packageName}/raw/"
    for (i in 1..40) {
        listUri.add(Uri.parse("${packageName}file$i"))
    }
}
Run Code Online (Sandbox Code Playgroud)

我的按钮操作:

  //Button action
   fun onClickStartTask(view: View) {
        var listNewPath = emptyList<String>()
        CoroutineScope(Main + job).launch {
            try {
                //shows something in the UI - progressBar
                withContext(IO) {
                    listNewPath = listUri.map { …
Run Code Online (Sandbox Code Playgroud)

android asynchronous fileinputstream kotlin kotlin-coroutines

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