java中的字节输入流的无参read方法,每次读到的是一个字节,还是一个基本数据的字节值?

FileInputStream 的无参read()方法,每次读到的是一个字节,那他返回给的int变量的是一个字节的int表现形式,还是一个基本数据(如char字符数据)的字节值的int表现形式?如果是返回的一个字节,那这个字节转化成的int值,最多只能取到2的8次方即255个,单个字节是无法表示一个字符的,如果原文件中有汉子,系统又是怎么样把一个字节的数据转换成汉子呢?本人新手,这块不是很理解,求大神解答,谢谢!

3个回答

字节的数据转换成汉子,先以字节读,再以字符转换
InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "UTF-8");

返回值就是你读取出来的一个字节,也就是说FileInputStream是一个个字节读取的,一般来说,需要在外层进行包装,比如外层再封装一个字符流,这样就可以以字符为单位读取了

是读的字节,不是字节值,汉字是按字节读,一个汉字2个字节,一般读file文件的时候读行是最快的

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
一个关于字节流的问题
//1.创建一个字节流输入对象,构造方法中绑定数据源 FileInputStream fis = new FileInputStream("C:\\Java.doc"); //2.创建一个字节输出流对象,构造方法中绑定目的地 FileOutputStream fos = new FileOutputStream("D:\\IO流练习\\java.doc"); //使用一个字节数组作为数据缓冲 byte[] bytes = new byte[1024]; //3.使用字节输入流对象中的read方法读取文件 int len = 0; while((len = fis.read(bytes)) != -1){ //4.使用字节输出流中的write,把读取到的字节写入到目的地 fos.write(bytes,0,len); } //5.关闭资源 fos.close(); fis.close(); 对于以上代码提问:对于执行方法fis.read(bytes)的返回值len,它应该表示为读取文件的有效长度下标bytes.length-1,为什么可以等于-1. 解决完上述问题,那么再问:当读取的返回值len=-1,表示输入流读取数据已经读到文件结束了,那么这个时候fos.write(bytes,0,len)这段代码应该不会再执行了,那么最后一次读取的数据还保存在数组bytes里面,而没有执行输出流操作 那这段代码为什么在执行的时候可以完整的复制一个文件,而没有数据丢失???
java中字节输入和输出流
FileInputStrean in = new FileInputStrean("xxx"); byte[] b= new byte[1024]; in.read(b);一次读若干个字并且保存到参数b指定的字节数组中,这若干个字节是多少呢?是不是就是字节数组的长度?
eclipse在利用文字字节输入输出流实现文件的拷贝时,为什么出现图片无法拷贝的情况
```package io02; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; /** * 文件的拷贝:文件字节输入、输出流 * @author karry * */ public class Copy { public static void main(String[] args) { //1.创建源 File src=new File("p.png");//源头 File dest=new File("copyp.png");//目的地 //2.选择流 InputStream is=null; OutputStream os=null; try { //3.操作(分段读取) is=new FileInputStream(src); os=new FileOutputStream(dest); byte[] flush=new byte[1024];//缓冲容器 int len=-1;//接收长度 while((len=is.read(flush))!=-1) { os.write(flush,0,len);//分段写出 os.flush(); } } catch (FileNotFoundException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); }finally { //4、释放资源 分别关闭 先打开的后关闭 try { if (os != null) { os.close(); } } catch (Exception e) { // TODO: handle exception } try { if(is!=null) { is.close(); } } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } } } ```
java io流read()的问题
![图片说明](https://img-ask.csdn.net/upload/201608/08/1470641819_816489.png) 在这个方法中 fis.read(buffer); 我看API中read()的描述是这样的“从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。”。如果是这样的话那数据不是已经储存到byte[]数组中了吗?不是可以直接执行for循环了吗,为什么还要用到输出流啊。 菜鸟不懂啊,求大神指导。。。
关于获取 InputStream 输入流的 字节数
现在要获取 InputStream 流的字节数, 所以用 available()获取字节长度 ,结果出错 报IO异常 下面为代码部分: 调用下面方法时,会传入一个有内容的 输入流 [code="java"] public final void writeInputStream(InputStream in,OutputStream out){ try { int len = in.available(); //这一行报错!!! byte[] data=new byte[1024*1024*10]; int bytesRead=0; while((bytesRead=in.read(data,0,1024*1024*10))!=-1) { out.write(data, 0, bytesRead); } in.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } } [/code] [b]问题补充:[/b] 为什么 [code="java"] while((bytesRead=in.read(data,0,1024*1024*10))!=-1) [/code] 这个方法可以获取流的字节数, 而我直接用 in.available(); 获取字节数却出错,并且有 IOException?
java.net.SocketTimeoutException: Read timed out
1、每次在进行批作业的时候,会构建http的请求 ``` * 定时发送监控信息到质检端 * * @return */ @Scheduled(fixedRate = 60000*5) public String sendMonitorInfo() throws IOException { List<Map> info = monitorService.getMonitorInfo(); logger.debug("monitor info{}",info); String result = HttpUtil.doPost(sendURL,JSONArray.toJSONString(info),10000,10000); logger.debug("send monitor result{}",result); return result; } ``` 2、在请求构建完成之后,会发送请求 ``` //发送请求 HttpResponse response = httpClient.execute(post); HttpEntity entityReaponse = response.getEntity(); if (entityReaponse != null) { inputStream = entityReaponse.getContent(); //转换为字节输入流 BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, Consts.UTF_8)); while ((body = br.readLine()) != null) { result.append(body); } } } catch (Throwable e) { e.printStackTrace(); logger.error("http post error:",e); return null; } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); return null; } } } ``` 这个错应该是在 while ((body = br.readLine()) != null)方法中的,但是不知道为什么 debug的时候就显示read time out 求大神帮忙解答一下
JAVA接收POST方式的HTTP请求时,用字节数组缓冲,读取到末尾程序卡住
各位大神好,本人非专业程序员,业余时间自学java遇到如下问题: 在学习编写服务器的过程中,尝试使用字节数组对POST方式的HTTP请求进行读取。 尝试了两个方法: 1. 直接使用.available()方法获得请求输入流的长度,并定义对应大小的字节数组,程序能够正常运行并输出请求 2. 将字节数组大小固定为10,使用while循环读取,此时程序是没有输出的。 于是在while循环中增加了输出每个循环读取内容到控制台,发现在读取到请求正文末尾时,while循环未跳出,也不继续执行循环体,如果此时关闭网页则可以结束循环,问题可能比较基础,还望大神们能够帮忙解惑,谢谢! 为了把问题说明的更清楚,这里加了个动图: ![图片说明](https://img-ask.csdn.net/upload/201703/16/1489633260_561168.gif) ``` java public class Server { private ServerSocket server; /** * 开启服务器 */ public void start() { try { // 新建服务器后等待客户端连接 // 对应访问地址为:http://localhost:8888/ server = new ServerSocket(8888); acceptClient(); } catch (IOException e) { e.printStackTrace(); } } /** * 连接客户端 */ private void acceptClient() { try { // 等待客户端连接 Socket client = server.accept(); // 选择字节输入流进行读取 BufferedInputStream bis = new BufferedInputStream( client.getInputStream() ); // // 获取输入流字节的长度并创建对应的字节数组 // byte[] buffer = new byte[bis.available()]; // for (int i = 0; i < buffer.length; i ++){ // buffer[i] = (byte)bis.read(); // } // // 去除请求中的空格,方便后续使用 // String request = new String(buffer,0,buffer.length).trim(); // 获取输入流字节的长度并创建对应的字节数组 StringBuilder sb = new StringBuilder(); byte[] buffer = new byte[10]; int len = 0; while ((len = bis.read(buffer))!=-1){ String tmp = new String(buffer, 0, len); System.out.println(tmp); sb.append(tmp); } // 去除请求中的空格,方便后续使用 String request = sb.toString().trim(); System.out.println(request); } catch (IOException e) { e.printStackTrace(); } } /** * 关闭服务器 */ public void stop(){ try { server.close(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { Server server = new Server(); server.start(); } } ```
java后台将base64字符串转换为PDF后生成的PDF打不开怎么回事呀
![图片说明](https://img-ask.csdn.net/upload/201910/12/1570868633_161609.jpg) 后台代码: public static void base64StringToPdf(String base64Content,String filePath){ File file = new File(filePath);// 将原来参数修改为字符串 BASE64Decoder decoder = new BASE64Decoder(); BufferedInputStream bin = null; FileOutputStream fout = null; BufferedOutputStream bout = null; try { //将base64编码的字符串解码成字节数组 byte[] bytes = decoder.decodeBuffer(base64Content); //创建一个将bytes作为其缓冲区的ByteArrayInputStream对象 ByteArrayInputStream bais = new ByteArrayInputStream(bytes); //创建从底层输入流中读取数据的缓冲输入流对象 bin = new BufferedInputStream(bais); //创建到指定文件的输出流 fout = new FileOutputStream(file); //为文件输出流对接缓冲输出流对象 bout = new BufferedOutputStream(fout); byte[] buffers = new byte[1024]; int len = bin.read(buffers); while(len != -1){ bout.write(buffers, 0, len); len = bin.read(buffers); } //刷新此输出流并强制写出所有缓冲的输出字节,必须这行代码,否则有可能有问题 bout.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { bout.close(); fout.close(); bin.close(); } catch (IOException e) { e.printStackTrace(); } } } 前台是将页面展示的数据图标什么的生成PDF 前台代码: function downloadofpdf(){ var varname = $("#taskid").text(); if(confirm("您确认下载该PDF文件吗?")){ var target = document.getElementById("bodyid"); target.style.background = "#FFFFFF"; // if(pdfName==''||pdfName==undefined) pdfName= getNowFormatDate(); html2canvas(target, { onrendered:function(canvas) { var contentWidth = canvas.width; var contentHeight = canvas.height; //一页pdf显示html页面生成的canvas高度; var pageHeight = contentWidth /1592.28 * 841.89; //未生成pdf的html页面高度 var leftHeight = contentHeight; //页面偏移 var position = 0; //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高 var imgWidth = 595.28; var imgHeight = 592.28/contentWidth * contentHeight; var pageData = canvas.toDataURL('image/jpeg', 1.0); var pdf = new jsPDF('', 'pt', 'a4'); //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89) //当内容未超过pdf一页显示的范围,无需分页 if (leftHeight < pageHeight) { pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight ); } else { while(leftHeight > 0) { pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight); leftHeight -= pageHeight; position -= 841.89; //避免添加空白页 if(leftHeight > 0) { pdf.addPage(); } } } pdf.save(varname+".pdf"); // 将pdf输入为base格式的字符串 var buffer = pdf.output("datauristring"); // // 将base64格式的字符串转换为file文件 // var myfile = dataURLtoFile(buffer, varname); // var formdata = new FormData(); // formdata.append(name, myfile); $.post("/riskManage/uploadpdf",{data:JSON.stringify({formdata:buffer})},function(result){ //alert("hao"); }) //sc(); }, background: "#fff" }) } }
新手学java。利用java流实现文件夹的拷贝,可是拷贝结果文件全是零字节,求帮助
``` package cn.java.io.test; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class Demo09 { public static void dirsCopy(File srcPath,File destPath){ File copyPath = destPath; if(srcPath.isDirectory()){ //如果是文件夹,则创建新的文件夹关联。此关联用于在目标文件夹下创建与源文件夹同名的文件夹目录 copyPath = new File(destPath,srcPath.getName()); } //在目标文件夹下创建与源文件夹同名的文件夹目录 copyPath.mkdirs(); try { //将文件夹内文件进行逐个拷贝 fileDatilCopy(srcPath,copyPath); } catch (FileNotFoundException e) { System.out.println("文件不存在"); e.printStackTrace(); } catch (IOException e) { System.out.println("文件读写失败"); e.printStackTrace(); } } private static void fileDatilCopy(File srcPath,File copyPath) throws FileNotFoundException, IOException { if(srcPath.isFile()){ //如果源文件是文件而非文件夹 try { //调用fileCopy()方法对文件进行拷贝 fileCopy(srcPath,copyPath); } catch (FileNotFoundException e) { System.out.println("文件不存在"); e.printStackTrace(); } catch (IOException e) { System.out.println("文件读写失败"); e.printStackTrace(); } }else if(srcPath.isDirectory()){//如果源文件夹是文件而非文件 //确保目标文件夹存在 copyPath.mkdirs(); //获取下一级目录|文件 for(File sub:srcPath.listFiles()){ fileDatilCopy(sub,new File(copyPath,sub.getName())); } } } public static void fileCopy(File srcPath,File srcCopy) throws FileNotFoundException,IOException { //选择文件输入流 InputStream is = new FileInputStream(srcPath); //选择文件输出流 OutputStream out = new FileOutputStream(srcCopy,true); byte[] by = new byte[100000]; int len = 0; while(is.read(by)!= -1){ //读多少写多少,防止资源浪费 out.write(by,0,len); } //flush()方法强制刷出 out.flush(); //先打开后关闭原则,关闭流 out.close(); is.close(); } public static void main(String[] args) { //原路径 File srcPath = new File("D:/myCode/temp"); //指定路径 File destPath = new File("D:/myCode/Temp_1"); dirsCopy(srcPath,destPath); } } ```
关于Java中FileInputStream类的一些新手疑问
在每次使用FileInputStream的read方法时,需要用到字节数组bytes和真实读取长度len,如代码: ``` public static void read(){ File file = new File("D:/学习/Android/代码/Workplace/Java_8_1_File/a.txt"); try { //针对文件创建一个输入流 InputStream in = new FileInputStream(file); byte[] bytes = new byte[1024*1024*10];//定义一个10MB的字节数组 int len = -1;//每次真实读取的长度 StringBuffer buf = new StringBuffer(); try { while((len = in.read(bytes))!=-1){ buf.append(new String(bytes,0,len)); } in.close();//关闭 System.out.println(buf); } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); } } ``` ,其中在循环里,buf.append那一句中,每一次都把0处len字节数加入到buf中,那么倘若文件的数据是: 01234 为何最后输出的结果不是: 001012012301234 呢?
关于 I/O 中 读取/写入时,使用 int型 的问题
. 为什么读取/写入单个字节/字符,返回值/输入值都是 int型,为什么不用 byte/char,如下方法: . InputStream: abstract int read() 从输入流中读取数据的下一个字节。 从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。 . OutputStream: abstract void write(int b) 将指定的字节写入此输出流。 将指定的字节写入此输出流。write 的常规协定是:向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。 . Reader: int read() 读取单个字符。 返回: 作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1 . Writer: void write(int c) 写入单个字符。 写入单个字符。要写入的字符包含在给定整数值的 16 个低位中,16 高位被忽略。 参数: c - 指定要写入字符的 int。 . ------------------------------------------------------------- . 而多个字节/字符的读取/写入,都是用的byte/char数组,如下方法: . Inputstream: int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。 int read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节读入 byte 数组。 . OutputStream: void write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。 void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。 . Reader: int read(char[] cbuf) 将字符读入数组。 abstract int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分。 . Writer: void write(char[] cbuf) 写入字符数组。 abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。 . 最后推广一下正版问答地址:http://stackoverflow.com/ .
当输出0000000000000后停止运行要如何处理?
如下代码: String url = "http://www.xxx.com/xxx/downloadFile/" + filename + "." + format; loadQianURL("Desktop",url); /** * 文件或文件夹不存在则创建 * @param dir 文件夹 * @param filepath 文件名 */ public static void createDirFile(String dir){ File file = new File(dir); if(!file.exists()){ file.mkdirs(); } } /** * @param dir 子目录 * @param fileUrl 图片链接 * @return */ public static String loadQianURL(String dir,String fileUrl) { //获取文件名,文件名实际上在URL中可以找到 String fileName = fileUrl.substring(fileUrl.lastIndexOf("/")+1,fileUrl.length()); //这里服务器上要将此图保存的路径 String savePath = "D:/upload/"; if (!StringUtils.isEmpty(dir)){ savePath = savePath +dir+"/"; } createDirFile(savePath); try { /*将网络资源地址传给,即赋值给url*/ URL url = new URL(fileUrl); /*此为联系获得网络资源的固定格式用法,以便后面的in变量获得url截取网络资源的输入流*/ HttpURLConnection connection = (HttpURLConnection)url.openConnection(); //服务器的安全设置不接受Java程序作为客户端访问,解决方案是设置客户端的User Agent connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); System.out.println("0000000000000000000000000000"); DataInputStream in = new DataInputStream(connection.getInputStream()); System.out.println("111111111111111111111111111111"); /*此处也可用BufferedInputStream与BufferedOutputStream*/ DataOutputStream out = new DataOutputStream(new FileOutputStream(savePath+fileName)); /*将参数savePath,即将截取的图片的存储在本地地址赋值给out输出流所指定的地址*/ byte[] buffer = new byte[4096]; int count = 0; /*将输入流以字节的形式读取并写入buffer中*/ while ((count = in.read(buffer)) > 0) { out.write(buffer, 0, count); } out.close();/*后面三行为关闭输入输出流以及网络资源的固定格式*/ in.close(); connection.disconnect(); //返回内容是保存后的完整的URL /*网络资源截取并存储本地成功返回true*/ return savePath+fileName; } catch (Exception e) { System.out.println(e + fileUrl + savePath); return null; } } 运行结果:2019-10-22 16:43:55.545 2f1aa58b I: 0000000000000000000000000000 java.io.FileNotFoundException: http://www.xxx.com/xxx/downloadFile/1二维码.png 输出0000000000000后停止运行要如何处理?
FileInputStreamTest小程序出现FileNotFoundException异常
import java.io.*; public class FileInputStreamTest { public static void main(String[] args) throws IOException { // 创建字节输入流 FileInputStream fis = new FileInputStream( "FilenameFilterTest.java"); // 创建一个长度为1024的“竹筒” byte[] bbuf = new byte[1024]; // 用于保存实际读取的字节数 int hasRead = 0; // 使用循环来重复“取水”过程 while ((hasRead = fis.read(bbuf)) > 0 ) { // 取出“竹筒”中水滴(字节),将字节数组转换成字符串输入! System.out.print(new String(bbuf , 0 , hasRead )); } // 关闭文件输入流,放在finally块里更安全 fis.close(); } } Exception in thread "main" java.io.FileNotFoundException: .\FilenameFilterTest.java (系统找不到指定的文件。) at java.base/java.io.FileInputStream.open0(Native Method) at java.base/java.io.FileInputStream.open(Unknown Source) at java.base/java.io.FileInputStream.<init>(Unknown Source) at java.base/java.io.FileInputStream.<init>(Unknown Source) at FileInputStreamTest.main(FileInputStreamTest.java:8) 文件是存在的,换成其他文件或者绝对路径还是报错
Java保存网络图片到本地图片损毁
``` package imageView; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; /** * 从网络获取图片到本地 */ public class GetImage { /** * 测试 * * @param args */ public static void main(String[] args) { String url = "http://www.iteye.com/upload/logo/user/1134656/d44c2b36-9869-360a-9c87-e88eaf8db3a5.jpg"; byte[] btImg = getImageFromNetByUrl(url); if (null != btImg && btImg.length > 0) { System.out.println("读取到:" + btImg.length + "字节"); String fileName = "abc.jpg"; writeImageToDisk(btImg, fileName); } else { System.out.println("没有从该连接获得内容"); } } /** * 从输入流中获取数据 * * @param inStream * 输入流 * @return ByteArray * @throws Exception */ public static byte[] readInputStream(InputStream inStream) throws Exception { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); // 设置数据缓冲区 byte[] buffer = new byte[1024 * 2]; // 读取到数据的长度 int len; while ((len = inStream.read(buffer)) != -1) { outStream.write(buffer, 0, len); } outStream.close(); inStream.close(); return outStream.toByteArray(); } /** * 根据地址获得数据的字节流 * * @param strUrl * 网络连接地址 * @return */ public static byte[] getImageFromNetByUrl(String strUrl) { try { URL url = new URL(strUrl); // 处理以http开头的地址 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(10 * 1000);// 设置链接超时时间为10s InputStream inStream = conn.getInputStream();// 通过输入流获取图片数据 byte[] btImg = readInputStream(inStream);// 得到图片的二进制数据 inStream.close(); return btImg; } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return null; } /** * 将图片写入到磁盘 * * @param img * 图片数据流 * @param fileName * 文件保存时的名称 */ public static void writeImageToDisk(byte[] img, String fileName) { try { File file = new File("E:\\" + fileName); FileOutputStream fops = new FileOutputStream(file); fops.write(img); fops.flush(); fops.close(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } } ```
java 访问ftp读文件
项目中有一些数据信息必须存放在文件中,不存数据库,而且文件放在ftp服务器上,所以需要用到FtpClient读文件。 碰到问题如下: InputStream in = XXXXXX(通过ftpClient对象获取到输入流); byte[] buff = new byte[512]; int len = 0; while((len = in.read(buff)) != -1) { system.out.println("读取的长度: "+ len); } 假如文件流中一共有2036个字节,多次执行以上代码打印出来的结果会有两种 一: 512 512 512 500 二: 512 300 512 512 200 问题的意思就是情况2其中有一次读取会少于512个字节,是什么原因呢?情况一是想要的结果、但是多次运行以上代码,偶尔会出现情况二(比如执行10次出现2次) 急求解!!求帮忙
java WebSocket 相关 前端已经接收到值了,为什么后台代码还是会出异常呀
java Web Socket 初学者 最近遇到了一个问题 ,就是在后台向前端推送数据时前台页面明明接收到了值,但是后台代码还是会出异常这是为什么! 下面是我写的代码 这个是主线程代码 ``` package test; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class ChatServer { // 记录所有客户端的Socket public static List<Socket> clientSocket = new ArrayList<Socket>(); public ChatServer() throws Exception { // 创建ServerSocket,准备接受客户端连接 ServerSocket ss = new ServerSocket(30000); while (true) { System.out.println(clientSocket.size()); // 接收客户端连接 Socket socket = ss.accept(); // 将客户端Socket添加到clientSocket集合中 clientSocket.add(socket); // 启动线程 new ServerThread(socket).start(); } } public static void main(String[] args) throws Exception { new ChatServer(); } } ``` 下面是线程内代码 ``` package test; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.security.MessageDigest; import java.util.Iterator; import java.util.regex.Matcher; import java.util.regex.Pattern; import sun.misc.BASE64Encoder; public class ServerThread extends Thread{ private Socket socket; public ServerThread(Socket socket) { this.socket = socket; } private int as = 0; @SuppressWarnings("finally") public void run() { System.out.println("为用户:" + socket.getInetAddress().getHostName() + "开启线程"); try { // 得到Socket对应的输入流 InputStream is = socket.getInputStream(); // 得到Socket对应的输出流 OutputStream out = socket.getOutputStream(); byte[] buff = new byte[1024]; String req = ""; // 读取数据,此时建立与wabSocket的握手 int count = is.read(buff); // 如果读取的数据长度>0 if (count > 0) { // 将读取的数据转化为字符串 req = new String(buff, 0, count); // System.out.println("握手请求:" + req);// req = 客户端信息 // 获取WebSocket的值 String seckey = getSecWebSocketKey(req); String response = "HTTP/1.1 101 Switching Protocols\r\nUpgrade: " + "websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: " + getSecWebSocketAccept(seckey) + "\r\n\r\n"; System.out.println("secAccept = " + getSecWebSocketAccept(seckey)); //推送客户端 out.write(response.getBytes("utf-8")); int hasRedad = 0; // 不断读取WebSocket发送过来的数据 System.out.println("while循环前,等待前端推送数据。。。。。。。。。。。。"); while ((hasRedad = is.read(buff)) > 0) { //必须这么写 System.out.println("接收到客户端" + socket.getInetAddress().getHostName() + "字节数:" + hasRedad); /* * 因为WebSocket发送过来的数据遁寻了一定的协议格式, 其中第3~6个字节是数据掩码, * 从第七个字节开始才是真正的有效数据。 因此程序使用第3~6个字节对后面的数据进行了处理 */ for (int i = 0; i < hasRedad - 6; i++) { buff[i+6] = (byte)(buff[i%4+2]^ buff[i+6]); } //获得从浏览器发送过来的数据 String pushMsg = new String(buff, 6, hasRedad-6, "utf-8"); //遍历Socket集合,依次向每个Socket发送数据 int a=1; for(Iterator<Socket> it = ChatServer.clientSocket.iterator();it.hasNext();){ //获得集合中的Socket对象 System.out.println("Socket集合中有:"+ChatServer.clientSocket.size()+"个对象等待发送信息"); Socket s = it.next(); //发送数据时,第一个字节必须与读到的第一个字节相同 byte[] pushHead = new byte[2]; pushHead[0] = buff[0]; //发送数据时,第二个字节记录 发送数据的长度 pushHead[1] = (byte)pushMsg.getBytes("utf-8").length; try { System.out.println("web推送前"); System.out.println("Socket 的InputStream值:"+is.available()); System.out.println("web推送中........"); //发送前两个字节 s.getOutputStream().write(pushHead); //发送有效数据 s.getOutputStream().write(pushMsg.getBytes("utf-8")); } catch (Exception e) { System.out.println("向前端推送数据后发生了异常"); e.printStackTrace(); }finally{ //如果s.getInputStream().available() == 0,表明该Scoket已经关闭 //将该Socket从Socket集合中删除 System.out.println("从集合中删除该Socket对象"); ChatServer.clientSocket.remove(s); a=2; break; } } System.out.println("WEB 推送后"); if(a==2){ break; } } } } catch (Exception e) { System.out.println("有一个Socket对象关闭了,该对象线程结束"); }finally{ try { //关闭Socket System.out.println("关闭该Socket对象"); socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } // 获取WebSocket请求的Seckey private String getSecWebSocketKey(String req) { // 构建正则表达式,获取Sec-WebSocket-Key:后面的内容 Pattern p = Pattern.compile("^(Sec-WebSocket-Key:).+",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); Matcher m = p.matcher(req); if (m.find()) { // 提取Sec-WebSocket-Key String foundstring = m.group(); return foundstring.split(":")[1].trim(); } else { return null; } } // 根据WebSocket请求的Seckey计算SecAccept private String getSecWebSocketAccept(String key) throws Exception { String guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; key += guid; MessageDigest md = MessageDigest.getInstance("SHA-1"); md.update(key.getBytes("ISO-8859-1"), 0, key.length()); byte[] shalHash = md.digest(); BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(shalHash); } } ``` 没有错误信息,不报错的 但是就是程序走不了了
用IO流下载网上的图片,可是图片很模糊,不知道怎么回事。
有没有大神帮忙看下,问题在哪,不需要提供其他方法,只是想知道这个的问题在哪? ``` package socket.url; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL; public class CopyOfDownLoad { public static void main(String[] args) { // 相关的所有数据流 InputStream is = null; BufferedInputStream bis =null; OutputStream os = null; BufferedOutputStream bos = null; try { // 1、想要下载资源的网络地址和要保存的路径 // 资源地址 String string = "http://file28.mafengwo.net/M00/EF/F3/wKgB6lTG9UqAG0o2AA2IG9Yw6Og16.groupinfo.w665_500.jpeg"; // 保存路径 String pathname = "D:/sxtjava/图片.jpg"; URL url = new URL(string); // 2、通过openStream()获取字节输入流,进行读取;创建一个流用于写入本地文件 // 读取 // is = url.openStream();// 获取字节输入流 //或者 is = url.openConnection().getInputStream(); bis = new BufferedInputStream(is); byte[] buf = new byte[1024]; // 写入 File file = new File(pathname); os = new FileOutputStream(file); bos = new BufferedOutputStream(os); // 3、读取(下载)、写入(本地保存) int lenth= bis.read(buf); // 读取的不为空就继续读取 while (lenth != -1) { //写入 bos.write(buf,0,buf.length); bos.flush();//刷新 lenth= bis.read(buf); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 4、关闭资源 try { if (is != null) { is.close(); } } catch (IOException e) { e.printStackTrace(); } try { if (bis != null) { bis.close(); } } catch (IOException e) { e.printStackTrace(); } try { if (os != null) { os.close(); } } catch (IOException e) { e.printStackTrace(); } try { bos.flush();//刷新 if (bos != null) { bos.close(); } } catch (IOException e) { e.printStackTrace(); } System.out.println("保存成功!"); } } } ![图片说明](https://img-ask.csdn.net/upload/201707/15/1500119290_3254.jpg) ```
关于WebSocket的问题 为什么浏览器关闭后会出一下异常
错误信息 ```java.net.SocketException: Software caused connection abort: recv failed at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:129) at java.net.SocketInputStream.read(SocketInputStream.java:90) at test.UserSocket.run(UserSocket.java:43) java.net.SocketException: Software caused connection abort: recv failed at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:129) at java.net.SocketInputStream.read(SocketInputStream.java:90) at test.UserSocket.run(UserSocket.java:43) ``` 这是一个WebScoket 的小测试。我开了3个浏览器测试正常后,关闭其中一个就会这个异常以下是我的代码麻烦各位大神给看看 ``` package test; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; import sun.applet.Main; public class ServerSocketTest { public static List<Socket> clientSocket = new ArrayList<Socket>(); public ServerSocketTest() throws IOException{ ServerSocket ss = new ServerSocket(30000); System.out.println("服务器启动等待客户端连接"); while(true){ Socket s =ss.accept();//等待客户端连接 clientSocket.add(s); System.out.println("客户端总人数"+clientSocket.size()); //为新用户启动线程 new UserSocket(s).start(); } } public static void main(String[] args) throws IOException { new ServerSocketTest(); } } ``` 下面是线程代码 ``` package test; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.SocketException; import java.security.MessageDigest; import java.util.Iterator; import java.util.regex.Matcher; import java.util.regex.Pattern; import sun.misc.BASE64Encoder; public class UserSocket extends Thread{ private Socket socket; public UserSocket(Socket socke){ this.socket = socke; } @Override public void run() { try { InputStream is = socket.getInputStream();//获取用户输入流 OutputStream ops = socket.getOutputStream();//获取用户输出流 byte[] buff = new byte[1024];//字节 String red = ""; //用了存放客户端请求过来的内容(客户端信息) // 读取数据,此时建立与wabSocket的握手 int count = is.read(buff);//读取客户端请求内容的长度 if(count > 0){ //客户端请求数据转化字符串 red = new String(buff,0,count); //获取WebSocket的值 String seckey = getSecWebSocketKey(red); String response = "HTTP/1.1 101 Switching Protocols\r\nUpgrade: " + "websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: " + getSecWebSocketAccept(seckey) + "\r\n\r\n"; //推送向客户端 ops.write(response.getBytes("utf-8")); int hasRedad = 0; // 不断读取WebSocket发送过来的数据 System.out.println("while循环前,等待前端推送数据。。。。。。。。。。。。"); while((hasRedad = is.read(buff))>0){//判断循环读取 System.out.println("后台接收到值,进入While循环处理"); /* * 因为WebSocket发送过来的数据遁寻了一定的协议格式, 其中第3~6个字节是数据掩码, * 从第七个字节开始才是真正的有效数据。 因此程序使用第3~6个字节对后面的数据进行了处理 */ for (int i = 0; i < hasRedad - 6; i++) { buff[i + 6] = (byte) (buff[i % 4 + 2] ^ buff[i + 6]); } //获得从浏览器发送过来的数据 String pushMsg = new String(buff,6,hasRedad - 6, "utf-8");//第一个值要读取的字节,从第几个开始读取,字符串的总长度,字符集 //便利Socket集合,向每个Socket对象发送信息 for (Iterator<Socket> it = ServerSocketTest.clientSocket.iterator();it.hasNext(); ) { try { Socket s = it.next(); byte[] pushHead = new byte[2]; pushHead[0] = buff[0]; pushHead[1] = (byte) pushMsg.getBytes("utf-8").length; //发送前两个字节 s.getOutputStream().write(pushHead); //发送有效数据 s.getOutputStream().write(pushMsg.getBytes("utf-8")); } catch (SocketException e) { //如果捕获到异常将其从集合中删除 // 如果捕捉到异常,表明该Socket已经关闭 it.remove(); } } } } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }finally{ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } // 获取WebSocket请求的Seckey private String getSecWebSocketKey(String req) { // 构建正则表达式,获取Sec-WebSocket-Key:后面的内容 Pattern p = Pattern.compile("^(Sec-WebSocket-Key:).+", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); Matcher m = p.matcher(req); if (m.find()) { // 提取Sec-WebSocket-Key String foundstring = m.group(); return foundstring.split(":")[1].trim(); } else { return null; } } // 根据WebSocket请求的Seckey计算SecAccept private String getSecWebSocketAccept(String key) throws Exception { String guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; key += guid; MessageDigest md = MessageDigest.getInstance("SHA-1"); md.update(key.getBytes("ISO-8859-1"), 0, key.length()); byte[] shalHash = md.digest(); BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(shalHash); } } ``` 刚才又调试了几次,发现了一些新的东西。 同时开启多个页面进行程序测试。当其中一个页面关闭时,这个页面向后台发送了一条数据,后台接收后处理并发送给其他页面。但是这个页面关闭了,本线程下发送给其他页面的信息全部发送失败。由于发送信息发送不出去,本线程就在此处 ``` } catch (SocketException e) { //如果捕获到异常将其从集合中删除 // 如果捕捉到异常,表明该Socket已经关闭 it.remove(); } ``` 把其他的Socket对象全部删除了,导致所有的Socket对象连接都断开了。求教大神们有没有什么靠谱的解决办法
java 如何进行对网络文件的中转
大神们,请教一个问题,如何中转网络文件? 比如说一个网络文件,在我的页面上提供下载入口(这个网络文件的下载地址),点击下载即可下载这个网络文件,但来源显示的是我的域名,不是网络文件原本的域名,也就是说我这里是中转,并非下载到我的服务器,是提供给别人下载(让人感觉来源是我这,而非其他网络上) 我尝试了先读取网络文件的数据流,然后再写出去。这个方法对网络文件比较小的可以实现,但对大的文件,就会消耗在读取文件流,卡住了。。下面是代码,求大神救助 /** * 从输入流中获取字节数组 * @param inputStream * @return * @throws IOException */ public static byte[] readInputStream(InputStream inputStream) throws IOException { byte[] buffer = new byte[1024]; int len = 0; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while((len = inputStream.read(buffer)) != -1) { bos.write(buffer, 0, len); } bos.close(); return bos.toByteArray(); } /** * 附件下载 */ public void downloadTaxpayer(HttpServletRequest request,HttpServletResponse response,String path){ response.reset();//可以加也可以不加 response.setContentType("application/x-download");//设置为下载application/x-download OutputStream output = null; //FileInputStream bis = null; BufferedInputStream bis = null; File file = null; try{ URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //设置超时间为3秒 conn.setConnectTimeout(3*1000); //防止屏蔽程序抓取而返回403错误 conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); //得到输入流 InputStream inputStream = conn.getInputStream(); //获取自己数组 ========================这个位置读取大文件就会卡住了。 byte[] getData = readInputStream(inputStream); // 取得文件的后缀名。 String filenamedisplay = path.substring(path.lastIndexOf("/") + 1).toUpperCase(); file=new File(request.getSession().getServletContext().getRealPath("/")+"/pages/"+filenamedisplay); filenamedisplay = URLEncoder.encode(filenamedisplay,"UTF-8"); response.addHeader("Content-Disposition","attachment;filename=" + filenamedisplay); FileOutputStream os = new FileOutputStream(file); os.write(getData); os.close(); os = null; byte[] b = new byte[1024*512]; output = response.getOutputStream(); InputStream is = new FileInputStream(file); bis = new BufferedInputStream(is); int i = 0; while((i = bis.read(b)) > 0){ output.write(b, 0, i); } output.flush(); }catch (Exception e){ e.printStackTrace(); } finally{ if(bis != null){ try { bis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } bis = null; } if(output != null){ try { output.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } output = null; } file.delete(); } }
相见恨晚的超实用网站
相见恨晚的超实用网站 持续更新中。。。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
python 简易微信实现(注册登录+数据库存储+聊天+GUI+文件传输)
socket+tkinter详解+简易微信实现 历经多天的努力,查阅了许多大佬的博客后终于实现了一个简易的微信O(∩_∩)O~~ 简易数据库的实现 使用pands+CSV实现数据库框架搭建 import socket import threading from pandas import * import pymysql import csv # 创建DataFrame对象 # 存储用户数据的表(...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
JavaScript 为什么能活到现在?
作者 | 司徒正美 责编 |郭芮 出品 | CSDN(ID:CSDNnews) JavaScript能发展到现在的程度已经经历不少的坎坷,早产带来的某些缺陷是永久性的,因此浏览器才有禁用JavaScript的选项。甚至在jQuery时代有人问出这样的问题,jQuery与JavaScript哪个快?在Babel.js出来之前,发明一门全新的语言代码代替JavaScript...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Python 编程开发 实用经验和技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法和技巧,包括小数保留指定位小数、判断变量的数据类型、类方法@classmethod、制表符中文对齐、遍历字典、datetime.timedelta的使用等,会持续更新......
吐血推荐珍藏的Visual Studio Code插件
作为一名Java工程师,由于工作需要,最近一个月一直在写NodeJS,这种经历可以说是一部辛酸史了。好在有神器Visual Studio Code陪伴,让我的这段经历没有更加困难。眼看这段经历要告一段落了,今天就来给大家分享一下我常用的一些VSC的插件。 VSC的插件安装方法很简单,只需要点击左侧最下方的插件栏选项,然后就可以搜索你想要的插件了。 下面我们进入正题 Material Theme ...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
开源并不是你认为的那些事
点击上方蓝字 关注我们开源之道导读所以 ————想要理清开源是什么?先要厘清开源不是什么,名正言顺是句中国的古代成语,概念本身的理解非常之重要。大部分生物多样性的起源,...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
相关热词 基于c#波形控件 c# 十进制转十六进制 对文件aes加密vc# c#读取栈中所有的值 c# rsa256加密 好 学c# 还是c++ c# 和java的差距 c# curl网络框架 c# https证书请求 c# 中崎
立即提问