标签: datainputstream

使用AutoCloseable关闭多个资源(尝试使用资源)

我知道,如果资源实现了AutoCloseable,那么您通过try传递的资源将自动关闭.到现在为止还挺好.但是当我有几个我希望自动关闭的资源时,该怎么办?套接字示例;

try (Socket socket = new Socket()) {
    input = new DataInputStream(socket.getInputStream());
    output = new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {
} 
Run Code Online (Sandbox Code Playgroud)

所以我知道套接字将被正确关闭,因为它在try中作为参数传递,但输入和输出应如何正确关闭?

java sockets datainputstream try-with-resources autocloseable

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

DataInputStream不推荐使用readLine()方法

我在java 6. DataInputStream in = new DataInputStream(System.in);用于读取用户输入.不推荐使用readLine()时.阅读用户价值的工作是什么?

DataInputStream in = new DataInputStream(System.in);
int num;
try
{
  num = Integer.parseInt(in.readLine()); //this works

  num = Integer.parseInt(in);  //just in doesnt work.
}
catch(Exception e)
{
}
Run Code Online (Sandbox Code Playgroud)

请在不推荐使用readLine()时解释.

java user-input readline datainputstream

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

中断Java DataInputStream readFully()

我有一个Java applet,它从服务器流式传输视频(MJPEG).我用C#(Windows服务)编写了一个代理服务器,放在applet和多个视频服务器之间.HTML/CSS/Js前端与Java applet一起使用.所有功能都可以正常工作(最后!!!),除了一件事.

视频服务器允许您通过REST界面播放录制的视频.剪辑完成后,服务器将打开连接,以防您想要发送倒带或搜索等命令.该剪辑在小程序中正常播放,直到结束.如果您尝试启动一个新剪辑(需要从Javscript向applet发送命令),浏览器会冻结.但是,后续使用相同连接的命令会起作用,例如播放,暂停和搜索.如果我停止Windows服务,浏览器将再次响应.

这就是我假设正在发生的事情:剪辑结束(或暂停); 不再发送数据但连接仍处于活动状态.applet正在等待下一帧的代理,但是代理正在视频服务器上等待下一帧,这不会再发送任何数据.

这是读取每个帧的while循环中的代码

byte[] img = new byte[mContentLength];
inputStream.skipBytes(headerLen);
inputStream.readFully(img);
Run Code Online (Sandbox Code Playgroud)

我需要以某种方式中断此代码.

当在HTML前端中选择新的视频片段时,我们通知applet,它在CameraStream类上调用disconnect().这就是这个功能:

// DataInputStream inputStream
// HttpURLConnection conn
public void disconnect() {
    System.out.println("disconnect called.");
    if(running) {
        running = false;
        try {
            // close the socket
            if(inputStream != null) {
                inputStream.close();
            }
            if(conn != null) {
                conn.disconnect();
            }
            inputStream = null;
            System.out.println("closed.");
        } catch(Exception ignored) {
            System.out.println("exc:" + ignored.getMessage());
            main.reportErrorFromThrowable(ignored);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为了测试这个,我让一个快速剪辑播放并运行到最后.然后我选择一个新剪辑.在我的Java控制台中,我得到了输出,disconnect called.但是我没有收到后续closed.消息,也没有抓到那个通用的异常.当我停止Windows服务时,我终于得到了closed.消息,所以它似乎inputStream.close();是阻塞.

所以我想我的问题是如何阻止阻止?是readFully(img) …

java blocking datainputstream

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

在java中读取DataInputStream中的Integer用户输入?

我正在尝试使用DataInputStream从用户那里获得输入.但是这会显示一些垃圾整数值而不是给定值

我的代码是:

import java.io.*;
public class Sequence {
    public static void main(String[] args) throws IOException {
    DataInputStream dis = new DataInputStream(System.in);
    String str="Enter your Age :";
    System.out.print(str);
    int i=dis.readInt();
    System.out.println((int)i);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是

输入你的年龄:12岁

825363722

请解释一下.为什么我得到这个垃圾值以及如何纠正错误?

java datainputstream

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

要从java中的DataInputStream读取未知的缓冲区大小

我有以下声明:

DataInputStream is = new DataInputStream(process.getInputStream());

我想打印此输入流的内容,但我不知道此流的大小.我该如何阅读此流并打印出来?

java io inputstream datainputstream

6
推荐指数
2
解决办法
9543
查看次数

是否有一个类在Java中公开了一个无缓冲的readLine方法?

我正在清理工作中的一些代码库,其中一个较旧的类用于读写数据.该数据是US-ASCII编码的字符串和二进制编码的基元的混合.

当前实现使用DataInputStream,但正如您在文档中看到的那样,该readLine()方法已被弃用,因为与将字节转换为字符有关的问题.虽然这个编码问题并没有真正为我们提供,但是弃用是一个问题,因为它已经无法在某些版本的OpenJDK 7上运行,并且弃用意味着它可以在将来完全删除."官方"的另一种方法是使用readLineBufferedReader中,但我们不能做一个完整的换出与DataInputStream所自的BufferedReader不能真正处理的二进制编码的原语.

"混合"这两个类的问题是,当BufferedReader缓冲流时,它会使流标记前进.这意味着对readDouble()来自DataInputStream的方法的后续调用将因IOExceptions或EOFExceptions而失败,因为流标记的实际位置不是"应该"在应用程序逻辑的上下文中的位置.

我查看了某种hacky mark()/ reset()策略,但有时流是由FileInputStream支持的,它不支持mark()/ reset().

除了改变我们的数据协议以将原语写成字符或编写我自己的实现readLine()(这是令人惊讶的非平凡),有没有办法实现这一点?此时我甚至愿意考虑使用外部库.

java io readline bufferedreader datainputstream

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

需要数据输入流

有什么区别

FileInputStream fstream = new FileInputStream ("file1.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
Run Code Online (Sandbox Code Playgroud)

FileInputStream fstream = new FileInputStream ("file1.txt");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
Run Code Online (Sandbox Code Playgroud)

我们真的需要一个DataInputStream吗?

java datainputstream

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

DataInputStream vs InputStreamReader,试图在概念上理解这两者

正如我暂时理解它:

DataInputStream是一个InputStream子类,因此它读取和写入字节.如果您正在读取字节,并且您知道它们将是ints或其他一些原始数据类型,那么您可以byte使用它直接读取它们DataInputStream.

  • 问题:在读取内容之前,您是否需要知道正在读取的内容的类型(int,string等)?并且整个文件是否需要由一个原始类型组成?

我遇到的问题是:为什么不使用InputStreamReader缠绕InputStream的字节数据?使用这种方法,您仍然在读取字节,然后将它们转换为表示字符的整数.哪个整数表示哪些字符取决于指定的字符集,例如"UTF-8".

  • 问题:在什么情况下,如果InputStreamReader工作无效DataInputStream

我的猜测答案:如果速度真的很重要,你可以做到,那么将InputStream字节数据直接转换为原始数据DataInputStream将是要走的路?这避免了Reader必须将字节数据"转换"为int第一个; 并且它不依赖于提供一个字符集来解释返回的整数表示哪个字符.我想这就是人们的意思,DataInputStream允许机器独立读取底层数据.

  • 简化:DataInputStream可以将字节直接转换为基元.

引发整个事情的问题:我正在阅读以下教程代码:

    FileInputStream fis = openFileInput("myFileText");

    BufferedReader reader = new BufferedReader( new InputStreamReader( new DataInputStream(fis)));

    EditText editText = (EditText)findViewById(R.id.edit_text);

    String line;

    while(  (line = reader.readline()) != null){

        editText.append(line);
        editText.append("\n");
    }
Run Code Online (Sandbox Code Playgroud)

...我不明白教师为什么选择使用new DataInputStream(fis)它,因为它看起来不像直接从字节转换为基元的任何能力正在被利用?

  • 我错过了什么吗?

感谢您的见解.

java inputstreamreader datainputstream

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

DataInputStream.read返回小于len

我正在使用DataInputStream从套接字读取一些字节.我有一个从流中读取的预期字节数(在解码头之后,我知道消息中有多少字节)它在99%的时间内工作但偶尔我会读取的字节数小于len.

int numRead = dis.read(buffer, 0, len);
Run Code Online (Sandbox Code Playgroud)

什么可能导致numRead小于len?它不是-1.我希望read的行为在流被关闭或达到EOF之前就会阻塞,但是如果它是一个基于流的套接字,除非套接字关闭,否则这不会发生,对吧?

有没有办法从套接字读取字节,始终确保您读取len字节?

谢谢

java sockets inputstream datainputstream

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

套接字的DataInputStream的“可用”

我在客户端上有以下代码:

DataInputStream dis = new DataInputStream(socketChannel.socket().getInputStream());
while(dis.available()){
     SomeOtherClass.method(dis);
}
Run Code Online (Sandbox Code Playgroud)

但是available()不断返回0,尽管流中有可读数据。因此,在要读取的实际数据完成之后,空数据将传递到另一个要读取的类,这将导致损坏。

经过一番搜索;我发现available()在与套接字一起使用时这是不可靠的,我应该从流中读取前几个字节以实际查看是否有数据可解析。

但就我而言 我必须将DataInputStream我从套接字获得的引用传递给我无法更改的其他类。

是否可以从中读取一些字节DataInputStream而不破坏它,或者有其他建议?

java sockets datainputstream

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