我有一个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) 我遇到了问题 - 我需要从Android APK(例如key.keystore)读取SecretKey,对于我的应用程序,它必须被读取为FileInputStream,但是从资产中我只得到inputStream.如何将inputStream转换为FileInputStream?或者有没有其他方法,如何从文件作为fileInputStream访问文件?
谢谢
我想一块一块地读一个文件.该文件被分成几个部分,存储在不同类型的媒体上.我目前所做的是调用文件的每个单独部分,然后将其合并回原始文件.
问题是我需要等到所有块都到达才能播放/打开文件.是否有可能在他们到达时阅读这些块,而不是等待它们全部到达.
我正在处理媒体文件(电影文件).
问题类似于以下两个问题.
但我仍然无法完全理解它.
到目前为止,我认为以下代码中的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说如果还没有输入,则此方法会阻塞.
什么" 没有输入可用 "是什么意思?
谢谢.
我想将 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) 我知道很多编译器的优化可能相当深奥,但我的例子非常简单,我想看看我能理解,如果有人知道它可以做什么.
我有一个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秒.因此,从我的非正式的临时实验看,字符串和流函数是运行时检查的牺牲品?我再次回到家时会再次检查.
我正在尝试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!此外,如果我忽略大小并开始读取返回的字节,则根本不匹配我的测试文件!
那么这里发生了什么?有没有办法解决这个问题?
我知道skip(long)的方法FileInputStream跳过从该文件的起始位置字节,并将文件指针.但是如果我们想在文件中间只跳过20个字符,并且要读取文件的剩余部分,我们应该怎么做?
所以我正在为学校做一个项目,我需要在二进制数据文件中读取并使用它为角色制作统计数据,如力量和智慧.它的设置使前8位构成一个统计数据.
我想知道这样做的实际语法是什么.是否像阅读文本文件一样.
File file = new File("CharacterStats.dat");
Scanner inputScanner = new Scanner(file);
inputScanner.next();
Run Code Online (Sandbox Code Playgroud) 我创建了以下应用程序来说明一些疑问。我在 Github 上的示例
在此示例中,我将文件复制到另一个包。
我的疑惑如下:
并行执行任务,是否可以返回取消之前完成的值?
contentResolver.openInputStream (uri)当我使用 IO 上下文时,为什么会出现“不适当的阻塞方法调用”消息?
当我读取文件条目以复制到输出时,我总是检查作业状态,以便当取消此任务时,它会立即停止,创建的输出文件被删除并返回取消异常,这是正确的吗?
我可以限制执行的任务量吗?
我的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
fileinputstream ×10
java ×6
android ×3
inputstream ×3
blocking ×2
io ×2
amazon-s3 ×1
assets ×1
asynchronous ×1
binary ×1
c++ ×1
file ×1
http-chunked ×1
java-io ×1
kotlin ×1
optimization ×1
skip ×1