byte[1024] 这个有多大

lingfeng892 2014-06-06 02:03:53
最近学习网络编程看到的代码如下:不知道 byte[] buf = new byte[1024]; 中buf是多大。比如上传文件,好像不管上传的内容有多大,都能用这个,能不能解释一下这句什么意思
InputStream in = s.getInputStream();

byte[] buf = new byte[1024];
int len = in.read(buf);
String text = new String(buf, 0, len);
...全文
12141 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
真家伙 2016-08-11
  • 打赏
  • 举报
回复
很好,mark一下
lingfeng892 2014-06-12
  • 打赏
  • 举报
回复
引用 16 楼 u014547383 的回复:
你可以对比一下,你发送的语句前面4个字没错,从第5个到第9个出现了乱码,后面又正常了,而你的缓冲数组长度是9个字节,所以就是说在你这里一个汉字是2个字节的,你的数组能存9个字节,把前面4个汉字正常的存了进去,但是却只能存储第5个汉字(已)的一个字节,剩下的一个字节被存到了下一个数组,在组装成字符串的时候就出错了,第一个数组有4个正常的汉字和一个不知道的字符,然后第2个数组进行组装的时候先拿前面剩下的一个字节和下一个汉字(经)的第一个字节拼装成一个汉字,如果拼不出,就是乱码,接下来这几个乱码就是这样来的
OK明白了,谢谢了
Z-ero 2014-06-11
  • 打赏
  • 举报
回复
你可以对比一下,你发送的语句前面4个字没错,从第5个到第9个出现了乱码,后面又正常了,而你的缓冲数组长度是9个字节,所以就是说在你这里一个汉字是2个字节的,你的数组能存9个字节,把前面4个汉字正常的存了进去,但是却只能存储第5个汉字(已)的一个字节,剩下的一个字节被存到了下一个数组,在组装成字符串的时候就出错了,第一个数组有4个正常的汉字和一个不知道的字符,然后第2个数组进行组装的时候先拿前面剩下的一个字节和下一个汉字(经)的第一个字节拼装成一个汉字,如果拼不出,就是乱码,接下来这几个乱码就是这样来的
Z-ero 2014-06-11
  • 打赏
  • 举报
回复 1
引用 14 楼 lingfeng892 的回复:
[quote=引用 13 楼 lingfeng892 的回复:] [quote=引用 12 楼 u014547383 的回复:] [quote=引用 11 楼 lingfeng892 的回复:] [quote=引用 10 楼 u010379510 的回复:] 这个就是循环读取,是一个临时空间,多大都没关系
就是说它自身就有循环,不需要自己再写一个循环,是这样的吗?[/quote] 不是自身有循环,这样写只是定义一个字节数组作为一个缓存,临时存储输入流读取到的数据 如果你没加循环的话就只读1024Byte大小的数据。这样写应该是确定要读取的文件不超过1KB吧。 如果不确定读取的数据大小就要加循环了

InputStream in = s.getInputStream();
         
byte[] buf = new byte[1024];
int len = -1;
while((len=in.read(buf))!=-1){
       //这里对读取到的数据进行处理
       // 比如这样
      String text = new String(buf, 0, len);
}

[/quote] OK 明白了,谢了[/quote] 我用在网络编程中,为什么会打出来乱码
InputStream in = s.getInputStream();
		byte[] buf = new byte[9];
		int len = 0;
		StringBuffer sb = new StringBuffer();
		while ((len = in.read(buf)) != -1) {
			String str = new String(buf, 0, len);
			sb.append(str);
		}
		
		System.out.println("ip = " + s.getInetAddress().getHostAddress());
		System.out.println("data = " + sb);
		System.out.println("port = " + ss.getLocalPort());
输出结果是:
服务器端启动...
ip = 10.1.52.112
data = 这是一个?丫谙氚?法 TCP 程序sfadasdf要在要在...
port = 10000
发送的数据是:
byte[] buf = new String("这是一个已经在想办法 TCP 程序sfadasdf要在要在...").getBytes();
[/quote] 这个涉及到编码问题了, InputStream是字节流,也就是说它发送数据时是以字节的形式发送的,然后你用这种方式编码成字符串
String str = new String(buf, 0, len);
但是你的缓冲数组定的太小了,只有9个字节,造成了数组的最后可能存储的是一个汉字解码后的一部分字节,然后另外一部分被存到了下一个数组,组装成另外的字符串了,所以就出现了乱码
lingfeng892 2014-06-11
  • 打赏
  • 举报
回复
引用 13 楼 lingfeng892 的回复:
[quote=引用 12 楼 u014547383 的回复:] [quote=引用 11 楼 lingfeng892 的回复:] [quote=引用 10 楼 u010379510 的回复:] 这个就是循环读取,是一个临时空间,多大都没关系
就是说它自身就有循环,不需要自己再写一个循环,是这样的吗?[/quote] 不是自身有循环,这样写只是定义一个字节数组作为一个缓存,临时存储输入流读取到的数据 如果你没加循环的话就只读1024Byte大小的数据。这样写应该是确定要读取的文件不超过1KB吧。 如果不确定读取的数据大小就要加循环了

InputStream in = s.getInputStream();
         
byte[] buf = new byte[1024];
int len = -1;
while((len=in.read(buf))!=-1){
       //这里对读取到的数据进行处理
       // 比如这样
      String text = new String(buf, 0, len);
}

[/quote] OK 明白了,谢了[/quote] 我用在网络编程中,为什么会打出来乱码
InputStream in = s.getInputStream();
		byte[] buf = new byte[9];
		int len = 0;
		StringBuffer sb = new StringBuffer();
		while ((len = in.read(buf)) != -1) {
			String str = new String(buf, 0, len);
			sb.append(str);
		}
		
		System.out.println("ip = " + s.getInetAddress().getHostAddress());
		System.out.println("data = " + sb);
		System.out.println("port = " + ss.getLocalPort());
输出结果是:
服务器端启动...
ip = 10.1.52.112
data = 这是一个?丫谙氚?法 TCP 程序sfadasdf要在要在...
port = 10000
发送的数据是:
byte[] buf = new String("这是一个已经在想办法 TCP 程序sfadasdf要在要在...").getBytes();
lingfeng892 2014-06-10
  • 打赏
  • 举报
回复
引用 12 楼 u014547383 的回复:
[quote=引用 11 楼 lingfeng892 的回复:] [quote=引用 10 楼 u010379510 的回复:] 这个就是循环读取,是一个临时空间,多大都没关系
就是说它自身就有循环,不需要自己再写一个循环,是这样的吗?[/quote] 不是自身有循环,这样写只是定义一个字节数组作为一个缓存,临时存储输入流读取到的数据 如果你没加循环的话就只读1024Byte大小的数据。这样写应该是确定要读取的文件不超过1KB吧。 如果不确定读取的数据大小就要加循环了

InputStream in = s.getInputStream();
         
byte[] buf = new byte[1024];
int len = -1;
while((len=in.read(buf))!=-1){
       //这里对读取到的数据进行处理
       // 比如这样
      String text = new String(buf, 0, len);
}

[/quote] OK 明白了,谢了
Z-ero 2014-06-08
  • 打赏
  • 举报
回复
引用 11 楼 lingfeng892 的回复:
[quote=引用 10 楼 u010379510 的回复:] 这个就是循环读取,是一个临时空间,多大都没关系
就是说它自身就有循环,不需要自己再写一个循环,是这样的吗?[/quote] 不是自身有循环,这样写只是定义一个字节数组作为一个缓存,临时存储输入流读取到的数据 如果你没加循环的话就只读1024Byte大小的数据。这样写应该是确定要读取的文件不超过1KB吧。 如果不确定读取的数据大小就要加循环了

InputStream in = s.getInputStream();
         
byte[] buf = new byte[1024];
int len = -1;
while((len=in.read(buf))!=-1){
       //这里对读取到的数据进行处理
       // 比如这样
      String text = new String(buf, 0, len);
}

lingfeng892 2014-06-08
  • 打赏
  • 举报
回复
引用 10 楼 u010379510 的回复:
这个就是循环读取,是一个临时空间,多大都没关系
就是说它自身就有循环,不需要自己再写一个循环,是这样的吗?
以夕阳落款 2014-06-08
  • 打赏
  • 举报
回复
这个就是循环读取,是一个临时空间,多大都没关系
doOneThingEveryday 2014-06-08
  • 打赏
  • 举报
回复
InputStream in = s.getInputStream();
		
		byte[] buf = new byte[1024];
		int len = in.read(buf);
		String text = new String(buf, 0, len);
你的这段代码是将输入流中的1024个字节放入buf缓存, 然后将buf缓存中的字节转化为字符串。 如果没有循环读流的话,那就只读了1024个字节,buf的大小对程序结果有影响,可能读不到所有输入流中的字节。 如果你有循环读流,那buf的大小其实对程序的结果是没有影响的,这种情况下,buf之相当于一个中间临时缓存。
lingfeng892 2014-06-07
  • 打赏
  • 举报
回复
引用 2 楼 rumlee 的回复:
这没有什么大的关系,你就是用999这样的数字也没有问题,就是每次读取的最大字节数。 例如一个2049字节的文件,你如果把buf设置成1024字节,则需要读3次,第一、二次读取到1024个字节,第三次读取到1个字节,就这么简单,与实际程序运行效果没有影响,只不过是多读几次而已。不过网络编程的时候,大小设置就需要比较合理了,因为要考虑粘包的问题。
三次是怎么读的?后面的数据不是要覆盖前面的数据吗
lingfeng892 2014-06-07
  • 打赏
  • 举报
回复
引用 5 楼 jty1046550887 的回复:
相当于临时存储下,多大没关系,小了,多循环几次就行。
循环在哪里?哪里开始哪里结束?怎么循环的?
AngryPenguin 2014-06-06
  • 打赏
  • 举报
回复
新号,回复的第一个帖子,哈哈! 1024Byte=1KB,分配1KB的缓存
  • 打赏
  • 举报
回复
相当于临时存储下,多大没关系,小了,多循环几次就行。
  • 打赏
  • 举报
回复

InputStream in = s.getInputStream();
        byte[] buf = new byte[1024];      //分配1024个字节大小的内存给buf
        int len = in.read(buf);                              //等同于read(b, 0, b.length) ,即读取1024个字节放到buf中,
        String text = new String(buf, 0, len);    //将读取的1024个字节构造成一个String类型的变量
lliiqiang 2014-06-06
  • 打赏
  • 举报
回复
长度是1024
rumlee 2014-06-06
  • 打赏
  • 举报
回复
这没有什么大的关系,你就是用999这样的数字也没有问题,就是每次读取的最大字节数。 例如一个2049字节的文件,你如果把buf设置成1024字节,则需要读3次,第一、二次读取到1024个字节,第三次读取到1个字节,就这么简单,与实际程序运行效果没有影响,只不过是多读几次而已。不过网络编程的时候,大小设置就需要比较合理了,因为要考虑粘包的问题。
致知Fighting 2014-06-06
  • 打赏
  • 举报
回复
没什么意思,就是一种习惯,2的指数,也有人用512也有人用2048,但是很少有人用500、1000、2000

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧