我有一个InputStream,我正在读取字符.我希望多个读者访问此InputStream.似乎一种合理的方法是将传入的数据写入StringBuffer或StringBuilder,并让多个读者读取它.不幸的是,不推荐使用StringBufferInputStream.StringReader读取一个字符串,而不是一个不断更新的可变对象.我有什么选择?写我自己的?
假设我有一个名为abhishek.txt的文件,其中包含以下行
我是,你叫什么名字.
现在我想写
阿布舍克
在"我"之后,就像我是Abhishek,..如何直接在这个特定的位置写出内容.
我知道一般的想法,但我不确定它是否有影响,因为Android api声明如下:"刷新此流.此方法的实现应确保写出任何缓冲的数据.此实现什么都不做."
这种实现没有任何作用< - 这是否意味着它无用或者我错过了什么?
我已经使用创建了一个服务器ServerSocket.之后,我创建了Client Socket,并连接到此服务器.
之后,我使用InputStream执行"一些东西",并从Socket Object获取OutputStream.但是,我真的不太了解inputStream和outputStream.这是我的简单代码:
private Socket sock = null;
private InputStream sockInput = null;
private OutputStream sockOutput = null;
...
String msg = "Hello World";
byte[] buffer = null;
try {
sockOutput.write(msg.getBytes(), 0, test.length());
sockOutput.write("Hello StackOverFlow".getBytes(), 0, test.length());
buffer = new byte[test.length()];
sockInput.read(buffer, 0, test.length());
System.out.println(new String(buffer));
sockInput.read(buffer, 0, test.length());
System.out.println(new String(buffer));
} catch (IOException e1) {
e1.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
结果将是:"Hello World"和"Hello StackOverFlow".
这是服务器端代码:
private int serverPort = 0;
private ServerSocket serverSock = null;
public VerySimpleServer(int serverPort) { …Run Code Online (Sandbox Code Playgroud) ChannelBufferInputStream responseStream = (ChannelBufferInputStream) response.getBodyAsStream();
ArrayList<Byte> arrayList = new ArrayList<Byte>();
try {
while (responseStream.available() > 0) {
arrayList.add(responseStream.readByte());
}
} catch (IOException e) {
e.printStackTrace();
return internalServerError();
}
Iterator<Byte> iterator = arrayList.iterator();
byte[] bytes = new byte[arrayList.size()];
int i = 0;
while (iterator.hasNext()) {
bytes[i++] = iterator.next();
}
Run Code Online (Sandbox Code Playgroud)
在我的Web应用程序的每个页面加载时调用此代码.它似乎运行得非常快,但是有什么能让它运行得更快吗?
编辑 - 使用字节数组输出流更新
ChannelBufferInputStream responseStream = (ChannelBufferInputStream) response.getBodyAsStream();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
int read = responseStream.read();
while (read != -1) {
byteArrayOutputStream.write(read);
read = responseStream.read();
}
} catch …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过这样做来创建输入流
InputStream is = (InputStream) getResources().openRawResource(R.drawable.image1);
Run Code Online (Sandbox Code Playgroud)
但我遇到了关于我的drawable文件(R.drawable.image1)的错误"类型原始的预期资源".image1是一个png,位于我的res/drawable文件夹中.
有任何想法吗???
我正在减少InputStreams像这样的流:
InputStream total = input.collect(
Collectors.reducing(
empty,
Item::getInputStream,
(is1, is2) -> new SequenceInputStream(is1, is2)));
Run Code Online (Sandbox Code Playgroud)
为了身份InputStream,我正在使用:
InputStream empty = new ByteArrayInputStream(new byte[0]);
Run Code Online (Sandbox Code Playgroud)
这有效,但有没有更好的方法来表示空InputStream?
我在从Android平台上的InputStream读取时遇到了一个奇怪的问题.我不确定这是Android特定的问题,还是我一般都做错了.
唯一特定于Android的是此调用:
InputStream is = getResources().openRawResource(R.raw.myfile);
Run Code Online (Sandbox Code Playgroud)
这将从Android资产返回文件的InputStream.无论如何,这是我遇到问题的地方:
bytes[] buffer = new bytes[2];
is.read(buffer);
Run Code Online (Sandbox Code Playgroud)
当read()执行时抛出IOException.奇怪的是,如果我执行两个连续的单字节读取(或任意数量的单字节读取),则没有例外.例如,这有效:
byte buffer;
buffer = (byte)buffer.read();
buffer = (byte)buffer.read();
Run Code Online (Sandbox Code Playgroud)
任何想法为什么两个连续的单字节读取工作,但一次调用同时读取两个引发异常?该InputStream中似乎罚款... is.available()回报超过一百万个字节(因为它应该).
堆栈跟踪显示在以下行之前的这些行InputStream.read():
java.io.IOException
at android.content.res.AssetManager.readAsset(Native Method)
at android.content.res.AssetManager.access$800(AssetManager.java:36)
at android.content.res.AssetManager$AssetInputStream.read(AssetManager.java:542)
Run Code Online (Sandbox Code Playgroud)
将缓冲区大小更改为单个字节仍会引发错误.看起来只有在读入字节数组时才会引发异常.
如果我将文件截断为100,000字节(文件最初为:1,917,408字节),它可以正常工作.超过一定大小的文件有问题吗?
任何帮助表示赞赏!
谢谢!
我可以将任何InputStream写入FileChannel吗?
我正在使用java.nio.channels.FileChannel打开文件并将其锁定,然后将InputStream写入输出文件.InputStream可以由另一个文件,URL,套接字或任何东西打开.我写了以下代码:
FileOutputStream outputStream = new FileOutputStream(outputFile);
FileChannel outputChannel = outputStream.getChannel();
FileLock lock = outputChannel.lock();
try {
outputChannel.transferFrom(???);
} finally {
lock.release();
outputChannel.close();
outputStream.close();
}
Run Code Online (Sandbox Code Playgroud)
但是,outputChannel.transferFrom(...)的第一个参数请求ReadableByteChannel对象.由于我使用InputStream作为输入,因此它没有inputStream.getChannel()方法来创建所需的通道.
有没有办法从InputStream获取ReadableByteChannel?
我的代码:
BufferedInputStream bis =
new BufferedInputStream(getClass().getResourceAsStream("playerhit.mp3"));
Run Code Online (Sandbox Code Playgroud)
当playerhit.mp3文件与MP3.class运行时的包在同一个包中时,此代码可以正常工作.我将其作为.jar运行.如果我将文件路径更改为类似/src/data/audio/playerhit.mp3它不再起作用的东西.在以.jar身份运行时,是否仍然可以访问不同于文件包根目录的文件路径?
inputstream ×10
java ×8
android ×3
outputstream ×2
drawable ×1
filechannel ×1
filelock ×1
filepath ×1
image ×1
io ×1
ioexception ×1
jar ×1
java-stream ×1
sockets ×1
textinput ×1