精华内容
下载资源
问答
  • 利用inputstream读取二进制文件,并转成outputstream: InputStream inputStream = getResources().openRawResource(R.raw.file3); ByteArrayOutputStream bytestream = new ByteArrayOutpu

           利用inputstream读取二进制文件,并转成outputstream:

                              InputStream inputStream = getResources().openRawResource(R.raw.file3);
    		        ByteArrayOutputStream bytestream = new ByteArrayOutputStream();  
    		        int ch;  
    		        try {
    					 while ((ch = inputStream.read()) != -1) {  
    					 bytestream.write(ch);  
    					}
    					} 
    		        catch (IOException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}  
    		        byte[] program = bytestream.toByteArray();  
    		        try {
    						bytestream.close();
    					} 
    		        catch (IOException e) {
    						// TODO Auto-generated catch block        
    						e.printStackTrace();
    					} 
                              OutputStream outputStream.write(program);
    展开全文
  • 本问题已经有最佳答案,请猛点这里访问。我正在尝试从二进制流中读取数据,其一部分应解析为UTF-8。...我知道这个问题与以多种格式从InputStream读取非常相似,但是那里提出的解决方案特定于HTTP流,这...

    本问题已经有最佳答案,请猛点这里访问。

    我正在尝试从二进制流中读取数据,其一部分应解析为UTF-8。

    直接将InputStream用于二进制数据,并将其顶部的InputStreamReader用于UTF-8文本是行不通的,因为阅读器将提前读取并弄乱后续的二进制数据,即使被告知要读取最大值n个字符。

    我知道这个问题与以多种格式从InputStream读取非常相似,但是那里提出的解决方案特定于HTTP流,这对我没有帮助。

    我想到只是将所有内容读取为二进制数据,然后将相关部分转换为文本。但是我只有字符数据的长度信息,而不是字节。因此,我需要从流中读取字符的事物来了解编码。

    有没有一种方法可以告诉InputStreamReader不要比读取给定字符数所需的内容提前读?还是有一种阅读器既支持二进制数据又支持带有编码的文本,并且可以在这些模式之间即时切换?

    您需要先阅读二进制部分。如果您识别出需要UTF-8解码的一部分字节,则需要提取这些字节并将其解码。

    DataInputStream dis =

    // read a binary type.

    int num = dis.readInt();

    int len = dis.readUnsignedShort();

    // read a UTF-8 portion.

    byte[] bytes = new byte[len];

    dis.readFully(bytes);

    String text = new String(bytes,"UTF-8");

    // read some binary

    double d = dis.readDouble();

    问题在于,对于UTF8,字节数可能与字符数不同。因此,我需要找出字符串中多字节字符的数量,读取更多字节,然后再次转换,然后反复进行直到数字匹配为止。

    我会说您的格式不是很容易解码,如果可以的话,我会修复它。但是,如果您知道字符数,则可以自己解析UTF-8。 (但是发送实际的字节数会容易得多)

    另一种方法是读取比所需更多的数据。以预期的字符数为例substring()并转换为UTF-8以确定长度。使用mark()和reset()并读取您现在知道的长度。 (仅当UTF-8编码完全相同时才有效:|例如,以两种不同方式对nul字节 0进行编码。(其他字符也可以如此)

    一条经验法则是,如果您需要使编码或解码更加困难,则使编码更困难并且使解码更加容易。

    好的,我决定更改格式,因为这确实是最简单的方法。

    我认为您不应该使用StreamReader。读者处理文本,但是您将文本和二进制数据一起处理。

    不可能。您必须读取二进制缓冲区并自己解释格式,即找到文本提取字节的位置并将其转换为String。

    为了简化此任务,我建议您创建自己的类(假设为ProtocolRecord。)它应该可序列化。它将包含您的所有字段。

    现在,您有2个选择:

    (1)简单的一种-使用Java序列化机制。在这种情况下,您只需要用DataInputStream封装流以进行读取,并用DataOutputStream封装以进行写入,然后读取/写入对象即可。这种方法的缺点是您无法控制协议。

    (2)自己实现方法readObject()和writeObject()。现在,如上所述使用DataInputStream和DataOutputStream。

    在这种情况下,您确实必须实现序列化协议,但至少它已封装到您的类中。

    它认为DataInputStream是您所需要的。

    展开全文
  • JAVA之读取二进制文件

    万次阅读 2018-10-26 22:56:03
    (1)读取二进制文件;其中需要考虑二进制文件读出来的是十进制数,需要将二个字节合成一个short型,并转换为int型值。 (2)画图;根据读取到的点的信息,循环,如果状态是画,则将该点与上一点相...

    0 引言

    最近老师让写一个程序,作为学习JAVA的练习。目的在于:将一个二进制文件中的数据读取出来,其中数据包括点的位置信息和压力值及状态。将这些数据画作图像的形式展示。

    本小程序分为以下几部分:

    (1)读取二进制文件;其中需要考虑二进制文件读出来的是十进制数,需要将二个字节合成一个short型,并转换为int型值。

    (2)画图;根据读取到的点的信息,循环,如果状态是画,则将该点与上一点相连;

    1 读取二进制文件

    所有的输入流类都是抽象类InputStream或Reader的子类。本文主要使用其中的FilterInputStream子类中的DataInputStream和BufferedInputStream这两个子类。

    1.1 DataInputStream

    构造函数为:

    DataInputStream(InputStream in)
    Creates a DataInputStream that uses the specified underlying InputStream.

    使用基础类InputStream构造DataInputStream

    方法主要有,见下表

    本文使用readFully(byte[] b)方法读取所有的字节信息。

    代码示例如下:

    DataInputStream dis = null;
    
    dis = new DataInputStream(new FileInputStream ("./test.txt"));
    
    byte []b = new byte [1024];
    
    dis.read(b);

    文件的所有信息都会存储在定义的byte数组中。

    1.2 BufferedInputStream

    构造函数如下:

    BufferedInputStream(InputStream in)
    Creates a BufferedInputStream and saves its argument, the input stream in, for later use.
    BufferedInputStream(InputStream in, int size)
    Creates a BufferedInputStream with the specified buffer size, and saves its argument, the input stream in, for later use.

    方法主要有,见下表

    主要使用read(byte [], off, len)方法读取文件信息。方法available()返回文件的字节数;

    示例代码如下:

    BUfferedInputStream bis = null;
    
    bis = new BufferedInputStream(new fileInputStream("./test.txt"));
    
    int len = bis.available();
    byte []b = new byte[len];
    
    bis.read(b, 0, len);

    byte数组中将存放文件的所有信息。

    1.3 处理数据

    根据以上两种方法获取了数据,接下来将对数据转换成int型。

    由于buff数组中存放的是一个字节一个字节的,故将两个字节组合即可。

    代码如下:

    int x = (buff[0] & 0xff) | (buff[1] & 0xff) << 8;
    int y = (buff[2] & 0xff) | (buff[3] & 0xff) << 8;

    以上是小端模式(低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节)的转换,大端(与小端相反)的话直接调换一下就行。

    2 画图

    采用Graphics2D进行画图,使用BufferedImage创建画,并通过方法getGraphics()返回2D图像。

     // create a BufferedImage with the size of (width, height)
            BufferedImage bufferedImage = new BufferedImage(width, height,                 
            BufferedImage.TYPE_INT_RGB);
            // to draw strokes, we need a Graphics2D - correlated with BufferedImage
            Graphics2D graphics2D = (Graphics2D) bufferedImage.getGraphics();
            // set the background to be WHITE
            graphics2D.setBackground(Color.WHITE);
            graphics2D.clearRect(0, 0, width, height);
            // set width and color for lines
            graphics2D.setPaint(Color.BLACK);
            graphics2D.setStroke(new BasicStroke(3));

    2.1 将所有点连接成线

    判断该点的状态是否是画,及下一个点是否是画,然后再连线

    int pos;
            boolean bDrawing = false;
            int xPrev=-1, yPrev=-1;
            for( pos = 4; pos + 7 <= nLength ; pos += 7)
            {
                byte status = buffer[pos];
                int x = ((buffer[pos+1]&0xff) | ((buffer[pos+2]&0xff) << 8)) / 10;
                int y = ((buffer[pos+3]&0xff) | ((buffer[pos+4]&0xff) << 8)) / 10;
                if( bDrawing ) {
                    if(status == 0x11) {
                        graphics2D.drawLine(xPrev, yPrev, x, y);
                        xPrev = x;
                        yPrev = y;
                    }
                    else {
                        bDrawing = false;
                    }
                }
                else {
                    if(status == 0x11) {
                        bDrawing = true;
                        xPrev = x;
                        yPrev = y;
                    }
                    else {
                        // floating
                    }
                }
    
            }

    3 结果

    4 总结

    任重而道远,老师还是最牛逼的!

    展开全文
  • java读取二进制文件

    2020-03-31 14:13:13
    Java读取二进制文件,以字节为单位进行读取,还可读取图片、音乐文件、视频文件等, 在Java中,提供了四种类来对文件进行操作,分别是InputStream OutputStream Reader Writer ,前两种是对字节流的操作,后两种则是...

    Java读取二进制文件,以字节为单位进行读取,还可读取图片、音乐文件、视频文件等,
    在Java中,提供了四种类来对文件进行操作,分别是InputStream OutputStream Reader Writer ,前两种是对字节流的操作,后两种则是对字符流的操作。


    示例代码如下:

        /**
         * 读取固件文件
         */
        private void readFirmware(String fileName){
            File file = new File(Const.baseDir + fileName);
            int i=0;
            try {
                System.out.println("一次读一个");
                // 一次读一个字节
                InputStream in = new FileInputStream(file);
                int temp_byte;
                while ((temp_byte = in.read()) != -1) {
                    System.out.print(HexUtil.decToHex(temp_byte).toUpperCase() + " ");//System.out.write(temp_byte);write是源内容,print是字节码
                    if (i++ == 35){
                        System.out.println();
                        i=0;
                    }
                }
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
                return;
            }
        }

    或者(下面不对的。。。)

    思路:按照字节读取文件到缓冲,然后对文件内容进行处理。

    代码如下:

    public static void readFile() throws IOException{
        RandomAccessFile f = new RandomAccessFile("test.txt", "r");
        byte[] b = new byte[(int)f.length()];
        //将文件按照字节方式读入到字节缓存中
        f.read(b);
        //将字节转换为utf-8 格式的字符串
        String input = new String(b, "utf-8");
        //可以匹配到所有的数字
        Pattern pattern = Pattern.compile("\\d+(\\.\\d+)?");
        Matcher match = pattern.matcher(input);
        while(match.find()) {
            //match.group(0)即为你想获取的数据
            System.out.println(match.group(0));
        }
        f.close();
    }

     

    展开全文
  • BinaryReader 读取二进制文件 在用BinaryReader文件时如果用BinaryReader.PeekChar()会出现什么缓冲区过小,在读取时应该知道他里面的数据类型再来读 取就不会出现问题了 转载于:...
  • Java读取二进制文件

    千次阅读 2016-02-17 16:05:13
    * 读取二进制文件并且写入数组里 * @param filePath * @return * @throws IOException * @throws FileNotFoundException */ public static byte[] getBytes4File(String filePath) t
  • 功能介绍:第“一”解决的是js代码实现file控件浏览图片显示到img,单击保存第“二”实现把file控件浏览到的图片转成二进制格式保存到数据库,第“三”实现从数据库读出二进制流图片显示到页面img控件;一 、 js...
  • 读取文件为如下方式的时候, File file = new File(path); FileInputStream is = new FileInputStream(file); try { byte[] temp = new byte[1024]; while (is.read(temp) > 0) { os.write(temp); } }
  • 最近手头的活儿暂告一段落,...说到这儿,很多人大概都会说,这有什么难的,Java读取二进制的方法有一大堆,随便找一个都可以读取,的确,Java的读取方法有很多,但是似乎没有一个读取一个字节就会让当前字节位提升一位
  • JDBC存储和读取二进制数据

    千次阅读 2015-01-18 11:47:39
    以下JSP文件用common-fileupload组件实现文件上传,并将文件以二进制文件的形式存入数据库 if("POST".equalsIgnoreCase(request.getMethod)){//如果是POST表单 DiskFileUpload diskFileUpload = newDiskFileUpload...
  • // 二进制文件地址 File inFile = new File("文件地址"); FileInputStream inputStream = new FileInputStream(inFile); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); int i; while...
  • Java JDBC读取二进制类型数据(BLOB)

    千次阅读 2012-12-28 22:58:26
    Java JDBC读取二进制类型数据(BLOB) 开发中我们常常会将一个图片存入数据库或者将一个文件存入数据库,那么就需要用到BLOB类型。今天和大家分享怎么把二进制文件用Java JDBC存入数据库。   一、建立数据库表 ...
  • JAVA中,读取Oracle中二进制BLOB类型数据,出现乱码.. 如果BLOB是文本类型存储的就不会存在乱码 BLOB blob = (oracle.sql.BLOB)rs.getBlob("ys1"); try{ FileOutputStream outStream = new ...
  • 今年我由c#转到JAVA写ANDROID程序,在用JAVA读我以前用C#生成的一些二进制数据文件时,发现总是出问题。后查到这里因为JAVA和C#中int 和short数据存放时高底位顺序完全不同造成的。所以不能直接读DataInputStream....
  • java读取二进制文件流

    千次阅读 2013-01-10 10:56:37
    package LearnJave.First; import java.io.*; public class ReadVideo { public static void main(String[] args) throws IOException { File file = new File("D://1.mp4");... InputStream in = null;
  • // i的目的在于防止最后一次读取的字节小于b长度,否则会自动被填充0 if ((i = fis.read(buff)) != -1) { System.out.println(new String(buff, 0, i)); } } catch (IOException e) { e.printStackTrace(); } ...
  • JDBC中关于二进制大对象的处理  在我们的工作中,我们可能会遇到一些比如关于图片等二进制对象的处理。那么我们应该如何来处理这些图片呢。当然JDBC中也提供了相关的方法来操作这些二进制的对象。但是在实际的开发...
  • DataInputStream读取二进制文件

    千次阅读 2008-11-11 00:24:00
    import java.io.DataInputStream;import java.io.EOFException;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;public class T { public static void...
  • InputStream fileIn = new FileInputStream(file); //DataInputStream in = new DataInputStream(fileIn); // 使用缓存区读入对象效率更快 BufferedInputStream in = new BufferedInputStream(file...
  • URL url = new URL(fileUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); conn.setReadTimeout(60000...inputStream = conn.getInputStream(); inputStre...
  • Java用JDBC保存读取二进制数据

    千次阅读 2011-03-09 10:34:00
    InputStream is=rs.getBinaryStream("object");  ObjectInputStream ois=new ObjectInputStream(is);  Vector v=(Vector)ois.readObject();  System.out.println("vector:"+v);  }  rs.close();  }  ps.close...
  • private void saveBinary(InputStream in, Long userId, String remark) { Sql sql = new Sql("insert into 表名 (id,CONTENT,USER_ID,REMARK) values(序列.NEXTVAL,?,?,?)"); sql.addParameter(new...
  • 二进制IO类

    2020-01-08 23:44:16
    抽象类InputStream读取二进制数据的根类,抽象类OutputStream是写入二进制数据的根类。
  • //从结果集中获取二进制流转为blob BLOB nFileBLOB = (BLOB) nResultSet.getBlob("FJ"); InputStream nInput = nFileBLOB.getBinaryStream(); //设置文件存储位置 String nFileUrl=StringTool.getRandomUUID(); ...
  • 二进制文件读取图片,其实就是用字节流读取图片。其实就是用Java中提供的对字节流操作的类去操控图片文件   import java.io.*; import javax.swing.*; public class Start { public static void main(String...
  • java读取文件:二进制文件 FileWriter只能接受字符串形式的参数,也就是说只能把内容存到文本文件。相对于文本文件,采用二进制格式的文件存储更省空间 InputStream用于按字节从输入流读取数据。其中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,925
精华内容 15,970
关键字:

inputstream读取二进制