java IO在写入文件的时候到了8192字节以后就报异常 50C

HttpClient httpclient = new HttpClient();

    File file = new File("D:\\cirros-0.3.4-x86_64-disk.img");//一个本地20多M的假镜像
    PutMethod put = new PutMethod("");//我使用httpclient3.1传输文件
    BufferedOutputStream bos = null;
    BufferedInputStream bis = null;
    //下面是将文件写入http的(OutputStream) put.getRequestEntity()中
    bos = new BufferedOutputStream((OutputStream) put.getRequestEntity());
    try {
        bis = new BufferedInputStream(new FileInputStream(file));
        byte[] buff = new byte[1024];
        int i;
        while ((i = bis.read(buff)) >= 0) {//这里前8次写入都没问题,到了第九次就会报异常了  异常是空指针,什么鬼呢?新手勿喷各位大神
            bos.write(buff, 0, i);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

4个回答

你最后一次刚好读取的是0 ,没有内容,所以while条件过来,但是null,你改成while ((i = bis.read(buff)) > 0)

java认为读到-1就为文件全部读取完毕,所以你可以把循环改为while ((i = bis.read(buff)) !=-1)

你的异常是空指针?是报的什么空指针,请把异常信息显示一下.上面的回答应该不正确,

把循环改为while ((i = bis.read(buff)) !=-1)

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java io流的问题
[code="java"]public class ByteTester { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); out.write(259);//00000000 00000000 00000001 00000011 byte [] buff = out.toByteArray(); out.close(); System.out.println("buff.length:="+buff.length); ByteArrayInputStream in = new ByteArrayInputStream(buff); int data; while((data=in.read())!=-1){ System.out.println(data); } in.close(); }[/code] 输出结果:buff.length:=1 3 我初步分析是:out.write 只是写入最低位的一个字节,所以读取出才是3 如果是这样的话,写入了数字259 读取的却是3 java io 通过什么保证写入和读出的是一致的呢
一个关于字节流的问题
//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里面,而没有执行输出流操作 那这段代码为什么在执行的时候可以完整的复制一个文件,而没有数据丢失???
android的访问服务器数据查询报java.io.EOFException错误
android为什么只有传递时间格式才报java.io.EOFException错误 private HttpPostUtil mHttp = null; private void refresh() { new Thread(new Runnable() { @Override public void run() { try { mHttp.clearTextParameter(); mHttp.setUrl(ConstantInfo.EVENT_QUERY_LIST_URL); mHttp.addTextParameter("item", mEventInfo); LogUtil.d("获取查询的条件", mEventInfo.getEventState()); mHttp.addTextParameter("pageSize", pageSize); LogUtil.d("获取查询的条件2", mEventInfo.getEndTime()); mHttp.addTextParameter("pageIndex", pageIndex); String result = mHttp.connect(); LogUtil.d("获取查询的条件3", result); eventList = GsonUtil.fromJsonList(result, EventInfo.class); LogUtil.d("获取查询的条件4", eventList); sendEmptyMessage(mHandler, ErrorCode.SUCCESS); } catch (ConnectException e) { LogUtil.e(TAG, e.toString()); sendEmptyMessage(mHandler, ErrorCode.ERROR_NETWORK); } catch (Exception e) { LogUtil.e(TAG, e.toString()); LogUtil.d("获取查询的条件5",e.toString()); sendEmptyMessage(mHandler, ErrorCode.ERROR_SERVICE); } } }).start(); } public String connect() throws IOException { //中断连接 this.isInterrupt = false; try { initConnection(); } catch (Exception e) { LogUtil.e(TAG, e.toString()); throw new ConnectException("连接服务器失败,可能设备没网络"); } conn.connect(); //写入流 OutputStream os = conn.getOutputStream(); LogUtil.d("获取的流是多少", os); mDataOutputStream = new DataOutputStream(os); LogUtil.d("获取的流是多少2", mDataOutputStream); //写入 writeStringParams(); writeFileParams(); paramsEnd(); LogUtil.d("获取的状态码是多少", conn.getResponseCode()); //连接成功的标志200 if(conn.getResponseCode() == HttpURLConnection.HTTP_OK) { //获取输入的流 InputStream in = conn.getInputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream(); int b = -1; while ((b = in.read()) > -1) { out.write(b); } byte[] arr = out.toByteArray(); out.close(); in.close(); mDataOutputStream.close(); os.close(); disconnect(); LogUtil.d("获取的字节的数组", arr); String result = new String(arr); if(TextUtils.isEmpty(result)) { throw new NullPointerException("服务器返回值为空"); } LogUtil.d(TAG, result); return result; } else { LogUtil.e(TAG , "响应码==> " + conn.getResponseCode()); throw new IOException("服务器异常"); } }
把数据+类型写入字节数组里这个程序总错,求大神指出错的地方,或者给出正确的代码,感激不尽
package 处理流; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; public class Demo02 { public static void main(String[] args) throws IOException{ read(write()); } //把数据+类型写到字节数组里 public static byte[] write()throws IOException { byte[] b2=null; ByteArrayOutputStream dos=new ByteArrayOutputStream(); DataOutputStream out=new DataOutputStream( new BufferedOutputStream(dos)); double point=3.14159; int num=2628; String str="我是汪洋"; String str02="刘林是我同学"; out.writeDouble(point); out.writeInt(num); out.writeUTF(str); out.writeUTF(str02); dos.flush(); b2=dos.toByteArray(); return b2; } //从字节数组中获得数据+类型 public static void read(byte[] b2)throws IOException { DataInputStream into=new DataInputStream( new BufferedInputStream( new ByteArrayInputStream(b2))); System.out.println("point="+into.readDouble()); System.out.println("num="+into.readInt()); System.out.println("str="+into.readUTF()); System.out.println("str02="+into.readUTF()); } }
get请求,参数拼接,时间字符串拼接报错,然后大佬们说的我好想不太清楚咋弄,就新添了请求方法,和调用
java.io.IOException: Server returned HTTP response code: 400 for URL: http://api.baidu.com/getsyncusers?code=02&date=2019-10-10 10:16:00.0 at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1894) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492) at com.dunan.zzjg.util.ApiGateToken.getResponseContext(ApiGateToken.java:115) at com.dunan.zzjg.service.impl.SysUserServiceImpl.setSyncUsers(SysUserServiceImpl.java:82) at com.dunan.zzjg.controller.DAapiController.userDate(DAapiController.java:44) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897) at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:90) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:96) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:66) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:117) at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:106) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) /** * 根据请求地址及请求参数,获取服务器的相应信息 * * @param requestURL 请求地址 * @param requestParam 请求参数 * @param requestMethod "POST" or "GET" * @return */ public static String getResponseContext(String requestURL, String requestParam, String requestMethod,String token) { StringBuffer responseContext = new StringBuffer(); try { URL url = new URL(requestURL); // 此处的urlConnection对象实际上是根据URL的 URLConnection urlConn = url.openConnection(); urlConn.setConnectTimeout(30000); urlConn.setReadTimeout(30000); // 请求协议(此处是http)生成的URLConnection类 的子类HttpURLConnection,故此处最好将其转化 // 为HttpURLConnection类型的对象,以便用到 HttpURLConnection更多的API.如下: HttpURLConnection httpUrlConnection = (HttpURLConnection) urlConn; // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在 // http正文内,因此需要设为true, 默认情况下是false; httpUrlConnection.setDoOutput(true); // 设置是否从httpUrlConnection读入,默认情况下是true; httpUrlConnection.setDoInput(true); // Post 请求不能使用缓存 httpUrlConnection.setUseCaches(false); // 设定传送的内容类型是可序列化的java对象 // (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException) httpUrlConnection.setRequestProperty("Content-type","application/json"); // 设置 HttpURLConnection的字符编码 httpUrlConnection.setRequestProperty("Accept-Charset", "UTF-8"); if(StringUtils.isNotBlank(token)){ httpUrlConnection.setRequestProperty("Access-Token", token); } // 设定请求的方法为"POST",默认是GET httpUrlConnection.setRequestMethod(requestMethod); // 连接,从上述第2条中url.openConnection()至此的配置必须要在connect之前完成, // // 此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法, // // 所以在开发中不调用上述的connect()也可以)。 if("POST".equals(requestMethod)){ OutputStream outStrm = httpUrlConnection.getOutputStream(); outStrm.write(requestParam.getBytes("UTF-8")); // // 刷新对象输出流,将任何字节都写入潜在的流中(些处为ObjectOutputStream) outStrm.flush(); // 关闭流对象。此时,不能再向对象输出流写入任何数据,先前写入的数据存在于内存缓冲区中, // 在调用下边的getInputStream()函数时才把准备好的http请求正式发送到服务器 outStrm.close(); } // 调用HttpURLConnection连接对象的getInputStream()函数, // 将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端。 InputStream inStrm = httpUrlConnection.getInputStream(); // 读取文件流程 BufferedReader rd = new BufferedReader( new InputStreamReader(inStrm,"UTF-8")); // 采取行的方式进行读取 String tempLine = rd.readLine(); // 循环获取每一行数据 while (tempLine != null) { responseContext.append(tempLine); tempLine = rd.readLine(); } rd.close(); inStrm.close(); httpUrlConnection.disconnect(); httpUrlConnection = null; urlConn = null; url = null; } catch (Exception e) { e.printStackTrace(); } return responseContext.toString(); } /*获取上次更新的时间*/ TurnoverTime lastTime = timeMapper.selectTime(); String lastUpdateTime = lastTime.getLastUpdateTime(); System.out.println(lastUpdateTime); String url = "http://api.baidu.com/getsyncusers"; String param = "?code="+"02"+"&date="+lastUpdateTime; String requestMethod = "GET"; String token = ApiGateToken.getToken(); String responseContext = ApiGateToken.getResponseContext(url+param, param, requestMethod, token);
用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) ```
base64字符串转成File且不写入磁盘
问题描述: 第三方系统传入图片base64的字符串到本系统,我们需要将该图片上传到 另一个dubbo接口中,该dubbo接口接收图片参数为java.io.File类型,目 前本系统是将图片base64的字符串解码byte[]后,写入本地,再用File对象 读取该路径下的文件后上传dubbo接口,再删除生成的文件。流程较为复杂, 有没有直接将base64字符串直接转成File对象的呢,本地就不用生成了。 ``` public static boolean GenerateImage(String imgStr,String fileName) {//对字节数组字符串进行Base64解码并生成图片 if (imgStr == null) //图像数据为空 return false; try { //Base64解码 byte[] b = Base64.decodeBase64(new String(imgStr).getBytes()); for(int i=0;i<b.length;++i) { if(b[i]<0) {//调整异常数据 b[i]+=256; } } //生成jpeg图片 String imgFilePath = fileName;//新生成的图片 OutputStream out = new FileOutputStream(imgFilePath); out.write(b); out.flush(); out.close(); return true; } catch (Exception e) { logger.debug("生成图片失败:"+e); return false; } } } ```
并发使用ImageIO速度慢问题
主要实现:使用ImageIO把BufferedImage写入到ByteArrayOutputStream输出流,从输出流取出字节数组进行网络传输。 问题: 1、少量比如10个线程调用的时候特别快大概只要几十ms; 2、并发200个线程调用的时候就很慢,就是逐渐增加的那种,一些是几十ms,一些是几百ms,一些是几千ms; 3、做了些时间截点,发现就是调用ByteArrayOutputStream的时候花费的时间多,本来是IO的流,我想换成NIO,但搜了一圈发现没有把用java生成图片转换到NIO流的。 代码: ``` BufferedImage bufImg = qRcodeCommon(contentBytes,size); long startTime=System.currentTimeMillis(); try { ImageIO.write(bufImg, imgType, bos);//缓存输出流接收生成的图片字节数组 BASE64Encoder encoder=new BASE64Encoder(); //System.out.println(encoder.encodeBuffer(bos.toByteArray())); String str=encoder.encodeBuffer(bos.toByteArray()); bos.reset(); System.out.println("写出数组:"+(System.currentTimeMillis()-startTime)+"ms"); return str; }catch (IOException e){ e.printStackTrace(); System.out.println("缓存图片出现IO异常"); } ``` 缩短时间,提高性能,各位大佬帮忙看看!
新手求教,关于java压缩文件的问题
import java.io.*; import java.util.zip.*; public class Myzip { private void zip(ZipOutputStream out,File f,String base) throws Exception{ if(f.isDirectory()){ File f1[]=f.listFiles(); out.putNextEntry(new ZipEntry(base+"/")); base=base.length()==0?"":base+"/"; for(int i=0;i<f1.length;i++){ zip(out,f1[i],base+f1[i]); } }else{ out.putNextEntry(new ZipEntry(base)); FileInputStream in=new FileInputStream(f); System.out.println(base); int b; while((b=in.read())!=-1){ out.write(b); } in.close(); } } public static void main(String[] args) { // TODO Auto-generated method stub try{ Myzip z=new Myzip(); ZipOutputStream out=new ZipOutputStream(new FileOutputStream("hello.zip")); z.zip(out,new File("hello"),""); System.out.println("压缩完成"); }catch(Exception e){ } } } 这个程序为什么不能实现压缩文件? 另外, out.putNextEntry(new ZipEntry(base+"/")); base=base.length()==0?"":base+"/"; 这两句是啥意思啊。。 base的作用是? 新手求教大神!非常感谢 附上书里的源代码: import java.io.*; import java.util.zip.*; public class MyZip { // 创建类 private void zip(String zipFileName, File inputFile) throws Exception { ZipOutputStream out = new ZipOutputStream(new FileOutputStream( zipFileName)); // 创建ZipOutputStream类对象 zip(out, inputFile, ""); // 调用方法 System.out.println("压缩中…"); // 输出信息 out.close(); // 将流关闭 } private void zip(ZipOutputStream out, File f, String base) throws Exception { // 方法重载 if (f.isDirectory()) { // 测试此抽象路径名表示的文件是否是一个目录 File[] fl = f.listFiles(); // 获取路径数组 out.putNextEntry(new ZipEntry(base + "/")); // 写入此目录的entry base = base.length() == 0 ? "" : base + "/"; // 判断参数是否为空 for (int i = 0; i < fl.length; i++) { // 循环遍历数组中文件 zip(out, fl[i], base + fl[i]); } } else { out.putNextEntry(new ZipEntry(base)); // 创建新的进入点 // 创建FileInputStream对象 FileInputStream in = new FileInputStream(f); int b; // 定义int型变量 System.out.println(base); while ((b = in.read()) != -1) { // 如果没有到达流的尾部 out.write(b); // 将字节写入当前ZIP条目 } in.close(); // 关闭流 } } public static void main(String[] temp) { // 主方法 MyZip book = new MyZip(); // 创建本例对象 try { // 调用方法,参数为压缩后文件与要压缩文件 book.zip("hello.zip", new File("src")); System.out.println("压缩完成"); // 输出信息 } catch (Exception ex) { ex.printStackTrace(); } } }
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(); } } } ```
多线程加上断点下载多个文件文件出现问题了
``` package cn.com.sinosoft.sfjy.util; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; import java.util.Map; import java.util.Set; public class DonwloadUtil { public static Map<FileName, DownloadVo> map; public DonwloadUtil(Map<FileName, DownloadVo> map) { DonwloadUtil.map = map; being(); } public void being() { System.out.println("++++++++++++++++++++++++++++++++++++++++++++"); Set<FileName> keySet = map.keySet(); for (FileName fileName : keySet) { map.get(fileName).setFinished(donwload(fileName)); } System.out.println("++++++++++++++++++++++++++++++++++++++++++++"); } public boolean donwload(FileName filename) { // 发送get请求,请求这个地址的资源 try { // 构建请求路径 URL url = new URL(DonwloadUtil.map.get(filename).getDonwloadPath()); // 发送连接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 请求方式 conn.setRequestMethod("GET"); // 请求连接超时 conn.setConnectTimeout(5000); // 连接中超时 conn.setReadTimeout(5000); // 请求连接成功 200 if (conn.getResponseCode() == 200) { // 拿到所请求资源文件的长度 long length = conn.getContentLength(); File file = new File(DonwloadUtil.map.get(filename).getTargetPath() + "/" + DonwloadUtil.map.get(filename).getFileName()); // 生成临时文件 RandomAccessFile raf = new RandomAccessFile(file, "rwd"); // 设置临时文件的大小 raf.setLength(length); raf.close(); // 计算出每个线程应该下载多少字节 long size = length / DonwloadUtil.map.get(filename).getThreadCount(); for (int i = 0; i < DonwloadUtil.map.get(filename).getThreadCount(); i++) { // 计算线程下载的开始位置和结束位置 long startIndex = i * size; long endIndex = (i + 1) * size - 1; // 如果是最后一个线程,那么结束位置写死 if (i == DonwloadUtil.map.get(filename).getThreadCount() - 1) { endIndex = length - 1; } System.out.println(filename+"线程" + i + "的下载区间是:" + startIndex + "---" + endIndex); new DownLoadThread(startIndex, endIndex, i, filename).start(); } } return true; } catch (Exception e) { e.printStackTrace(); return false; } } } class DownLoadThread extends Thread { long startIndex; long endIndex; int threadId; FileName filename; public DownLoadThread(long startIndex, long endIndex, int threadId, FileName filename) { super(); this.startIndex = startIndex; this.endIndex = endIndex; this.threadId = threadId; this.filename = filename; } @Override public void run() { try { // 存放当前线程的下载进度文件 File progressFile = new File(filename+""+threadId + ".txt"); // 判断进度临时文件是否存在 if (progressFile.exists()) { FileInputStream fis = new FileInputStream(progressFile); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); // 从进度临时文件中读取出上一次下载的总进度,然后与原本的开始位置相加,得到新的开始位置 startIndex += Integer.parseInt(br.readLine()); fis.close(); } // System.out.println("线程" + threadId + "的下载区间是:" + startIndex + // "---" + endIndex); // 再次发送http请求,下载原文件 HttpURLConnection conn; URL url = new URL(DonwloadUtil.map.get(filename).getDonwloadPath()); // 发送连接 conn = (HttpURLConnection) url.openConnection(); // 请求方式 conn.setRequestMethod("GET"); // 请求连接超时 conn.setConnectTimeout(5000); // 连接中超时 conn.setReadTimeout(5000); // 设置本次http请求所请求的数据的区间 conn.setRequestProperty("Range", "bytes=" + startIndex + "-" + endIndex); //System.out.println(filenaem+conn.getResponseCode()); // 请求部分数据,相应码是206 if (conn.getResponseCode() == 206) { // 流里此时只有1/3原文件的数据 InputStream is = conn.getInputStream(); byte[] b = new byte[1024]; int len = 0; int total = 0; // 拿到临时文件的输出流 File file = new File(DonwloadUtil.map.get(filename).getTargetPath() + "/" + DonwloadUtil.map.get(filename).getFileName()); // 生成临时文件 RandomAccessFile raf = new RandomAccessFile(file, "rwd"); // 把文件的写入位置移动至startIndex raf.seek(startIndex); while ((len = is.read(b)) != -1) { // 每次读取流里数据之后,同步把数据写入临时文件 raf.write(b, 0, len); total += len; System.out.println(filename+"线程" + threadId + "下载了" + total); // 生成一个专门用来记录下载进度的临时文件 RandomAccessFile progressRaf = new RandomAccessFile(progressFile, "rwd"); // 每次读取流里数据之后,同步把当前线程下载的总进度写入进度临时文件中 progressRaf.write((total + "").getBytes()); progressRaf.close(); } System.out.println(filename+"线程" + threadId + "下载完毕!"); raf.close(); DonwloadUtil.map.get(filename) .setFinishedThread(DonwloadUtil.map.get(filename).getFinishedThread() + 1); synchronized (DonwloadUtil.map.get(filename).getDonwloadPath()) { if (DonwloadUtil.map.get(filename).getFinishedThread() == DonwloadUtil.map.get(filename) .getThreadCount()) { for (int i = 0; i < DonwloadUtil.map.get(filename).getThreadCount(); i++) { File f = new File(filename+""+i+ ".txt"); f.delete(); } DonwloadUtil.map.get(filename).setFinishedThread(0); } } } } catch (Exception e) { e.printStackTrace(); } } } ```
当输出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后停止运行要如何处理?
急!!!安卓程序不能上传照片到服务器
我想做一个app 实现把拍下来的照片传到服务器上,现在可以拍照并保存到手机上面,但无法上传到服务器上,是什么情况? 服务器是用tomcat搭的 安卓上传的代码: import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.widget.Button; import android.widget.Toast; public class uploadActivity extends Activity { private Button uploadbutton; private String uploadFile = Environment.getExternalStorageDirectory().getAbsolutePath()+"/Test.jpg"; private String srcPath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/Test.jpg"; private String actionUrl = "http://192.168.1.105:8080/ATestInternetCameraServlet/"; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_photo); uploadbutton=(Button)findViewById(R.id.button2); uploadbutton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { uploadFile(); } }); } private void uploadFile() { String uploadUrl = "http://192.168.1.105:8080/ATestInternetCameraServlet/CameraServlet"; String end = "\r\n"; String twoHyphens = "--"; String boundary = "******"; try { URL url = new URL(uploadUrl); HttpURLConnection httpURLConnection = (HttpURLConnection) url .openConnection(); httpURLConnection.setDoInput(true); httpURLConnection.setDoOutput(true); httpURLConnection.setUseCaches(false); httpURLConnection.setRequestMethod("POST"); httpURLConnection.setRequestProperty("Connection", "Keep-Alive"); httpURLConnection.setRequestProperty("Charset", "UTF-8"); httpURLConnection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); DataOutputStream dos = new DataOutputStream(httpURLConnection .getOutputStream()); dos.writeBytes(twoHyphens + boundary + end); dos .writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + srcPath.substring(srcPath.lastIndexOf("/") + 1) + "\"" + end); dos.writeBytes(end); FileInputStream fis = new FileInputStream(srcPath); byte[] buffer = new byte[8192]; // 8k int count = 0; while ((count = fis.read(buffer)) != -1) { dos.write(buffer, 0, count); } fis.close(); dos.writeBytes(end); dos.writeBytes(twoHyphens + boundary + twoHyphens + end); dos.flush(); InputStream is = httpURLConnection.getInputStream(); InputStreamReader isr = new InputStreamReader(is, "utf-8"); BufferedReader br = new BufferedReader(isr); String result = br.readLine(); Toast.makeText(this, result, Toast.LENGTH_LONG).show();// dos.close(); is.close(); } catch (Exception e) { e.printStackTrace(); setTitle(e.getMessage()); } } } 服务器代码: import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class CameraServlet extends HttpServlet { protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { request.setCharacterEncoding("UTF-8"); // 设置处理请求参数的编码格式 response.setContentType("text/html;charset=UTF-8"); // 设置Content-Type字段值 PrintWriter out2 = response.getWriter(); // 下面的代码开始使用Commons-UploadFile组件处理上传的文件数据 FileItemFactory factory = new DiskFileItemFactory(); // 建立FileItemFactory对象 ServletFileUpload upload = new ServletFileUpload(factory); // 分析请求,并得到上传文件的FileItem对象 List<FileItem> items = upload.parseRequest(request); // 从web.xml文件中的参数中得到上传文件的路径 String uploadPath = "d:\\cameraupload\\"; File file = new File(uploadPath); if (!file.exists()) { file.mkdir(); } String filename = ""; // 上传文件保存到服务器的文件名 InputStream is = null; // 当前上传文件的InputStream对象 // 循环处理上传文件 for (FileItem item : items) { // 处理普通的表单域 if (item.isFormField()) { if (item.getFieldName().equals("filename")) { // 如果新文件不为空,将其保存在filename中 if (!item.getString().equals("")) filename = item.getString("UTF-8"); } } // 处理上传文件 else if (item.getName() != null && !item.getName().equals("")) { // 从客户端发送过来的上传文件路径中截取文件名 filename = item.getName().substring( item.getName().lastIndexOf("\\") + 1); is = item.getInputStream(); // 得到上传文件的InputStream对象 } } // 将路径和上传文件名组合成完整的服务端路径 filename = uploadPath + filename; // 如果服务器已经存在和上传文件同名的文件,则输出提示信息 if (new File(filename).exists()) { new File(filename).delete(); } // 开始上传文件 if (!filename.equals("")) { // 用FileOutputStream打开服务端的上传文件 FileOutputStream fos2 = new FileOutputStream(filename); byte[] buffer = new byte[8192]; // 每次读8K字节 int count = 0; // 开始读取上传文件的字节,并将其输出到服务端的上传文件输出流中 while ((count = is.read(buffer)) > 0) { fos2.write(buffer, 0, count); // 向服务端文件写入字节流 } fos2.close(); // 关闭FileOutputStream对象 is.close(); // InputStream对象 out2.println("文件上传成功!xii"); } } catch (Exception e) { } } }
JAVA图片浏览器的音乐播放,在切换下一首歌的时候,当前的歌还在播放,怎么解决?
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseListener; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.DataLine; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.SourceDataLine; import javax.sound.sampled.UnsupportedAudioFileException; import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.*; public class HOME extends JFrame implements ActionListener, ListSelectionListener { double height; JLabel imageview = new JLabel(); JButton b1 = new JButton(); JButton profile_photo = new JButton(); JButton switch1 = new JButton("<"); JButton switch2 = new JButton(">"); JButton First = new JButton("首张"); JButton Last = new JButton("末张"); ImageIcon icon1 = null; ImageIcon icon2 = null; JPanel North = new JPanel(); JPanel South = new JPanel(); JPanel Center = new JPanel(); JPanel West = new JPanel(); JPanel East = new JPanel(); JFileChooser chooser = new JFileChooser(); JMenuBar menuBar = new JMenuBar(); JTextArea phototext = new JTextArea(); String photo_name; // 文件列表 String Path = "./image"; File file = new File(Path); File[] list = file.listFiles(); int index = 0; /// 音乐播放 //音乐文件列表 String musicPath = "./music"; File musicfile = new File(musicPath); File[] musiclist = musicfile.listFiles(); int index_music = 0; JButton play = new JButton("播放"); JButton stop = new JButton("停止"); JButton playlast = new JButton("|<"); JButton playnext = new JButton(">|"); boolean isPlaying = false; boolean isRestart = false; Audio audio = new Audio(); // 菜单项 JMenuItem choosephoto = new JMenuItem("打开图片"); //图片列表 private String[] lists = { "111","222","333","444","555","666","777","888","999"}; JList photolist = new JList(list); public HOME() { // 框架设置 setTitle("图片浏览器"); setLocation(300, 100); setSize(1300, 900); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); setLayout(new BorderLayout()); //图片列表 photolist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); JScrollPane scrollpane = new JScrollPane(photolist); scrollpane .setPreferredSize(new Dimension(100,500)); //滚动条的大小即可调整列表长宽,如果想再加入一条横向滚动条,可设置列表的preferredSize // 组件添加 North.setLayout(new BorderLayout()); // 此处没有设置South的布局,因为设置后再将South面板放入框架中时,发现三个按钮无法全部加入,只能加入最后一个 Center.setLayout(new BorderLayout()); North.add(menuBar); add(North, BorderLayout.NORTH); Center.add(imageview); add(Center, BorderLayout.CENTER); West.add(scrollpane); //此处只需加入滚动条即可。不需要再加入photolist South.add(play); South.add(stop); South.add(playlast); South.add(playnext); South.add(switch1); South.add(switch2); South.add(First); South.add(Last); add(South, BorderLayout.SOUTH); add(East, BorderLayout.EAST); add(West, BorderLayout.WEST); // 监听器添加 switch1.addActionListener(this); switch2.addActionListener(this); First.addActionListener(this); Last.addActionListener(this); play.addActionListener(this); stop.addActionListener(this); playlast.addActionListener(this); playnext.addActionListener(this); photolist.addListSelectionListener(this); // 图像设置 // 头像/ ImageIcon image_local1 = new ImageIcon("./image/头像.jpg"); Image imageget1 = image_local1.getImage(); Image finalimage1 = imageget1.getScaledInstance(100, 100, Image.SCALE_AREA_AVERAGING); icon1 = new ImageIcon(finalimage1); // 图片/ // 组件设置 lb1.setFont(new Font("宋体", Font.BOLD, 20)); b1.setIcon(icon1); switch1.setVisible(true); switch2.setVisible(true); imageview.setIcon(icon2); imageview.setBounds(50, 50, 500, 500); phototext.setFont(new Font("宋体", Font.BOLD, 20)); phototext.setEditable(false); Menu(); // 线程启动 audio.start(); isPlaying = true; } public void Menu() { this.add(menuBar, BorderLayout.NORTH); this.setJMenuBar(menuBar); JMenu file = new JMenu("文件"); JMenuItem photolist = new JMenuItem("图片列表"); menuBar.add(file); menuBar.add(photolist); menuBar.add(phototext); menuBar.add(b1); file.add(choosephoto); setVisible(true); // 文件选择 chooser.setCurrentDirectory(new File("./image")); choosephoto.addActionListener(this); } @Override public void valueChanged(ListSelectionEvent e) { if(e.getSource() == photolist) { int index = photolist.getLeadSelectionIndex(); phototext.setText(""); photo_name = list[index].getPath(); ImageIcon image_local2 = new ImageIcon(photo_name); Image imageget2 = image_local2.getImage(); Image finalimage2 = imageget2.getScaledInstance(Center.getWidth(), Center.getHeight(),Image.SCALE_AREA_AVERAGING); icon2 = new ImageIcon(finalimage2); imageview.setIcon(icon2); imageview.setBounds(50, 50, 500, 500); File file = new File(list[index].getName()); String filename = file.getName(); double size = (file.length() / 1024.00); System.out.print(file.length()); phototext.setText(filename + " (" + String.valueOf(size) + "KB)"); } } private final Set<Long> THREADS = new HashSet<>(); public void someMethod () { if (THREADS.contains(Thread.currentThread().getId())) { throw new RuntimeException("该线程不能再调用这个方法"); } THREADS.add(Thread.currentThread().getId()); // 方法内容 } public void actionPerformed(ActionEvent e) { Runnable action = () ->{ if (e.getSource() == switch1) { while (index <= list.length) { if (index == 0) { JOptionPane.showMessageDialog(West, "已经是第一张图", "提示", JOptionPane.WARNING_MESSAGE); break; } index--; phototext.setText(""); photo_name = list[index].getPath(); ImageIcon image_local2 = new ImageIcon(photo_name); Image imageget2 = image_local2.getImage(); Image finalimage2 = imageget2.getScaledInstance(Center.getWidth(), Center.getHeight(), Image.SCALE_AREA_AVERAGING); icon2 = new ImageIcon(finalimage2); imageview.setIcon(icon2); imageview.setBounds(50, 50, 500, 500); File file = new File(list[index].getName()); String filename = file.getName(); double size = (file.length() / 1024.00); phototext.setText(filename + " (" + String.valueOf(size) + "KB)"); break; } } if (e.getSource() == switch2) { while (index <= list.length) { if (index == list.length) { JOptionPane.showMessageDialog(West, "已经是最后一张图", "提示", JOptionPane.WARNING_MESSAGE); } phototext.setText(""); photo_name = list[index].getPath(); ImageIcon image_local2 = new ImageIcon(photo_name); Image imageget2 = image_local2.getImage(); Image finalimage2 = imageget2.getScaledInstance(Center.getWidth(), Center.getHeight(), Image.SCALE_AREA_AVERAGING); icon2 = new ImageIcon(finalimage2); imageview.setIcon(icon2); imageview.setBounds(50, 50, 500, 500); File file = new File(list[index].getName()); String filename = file.getName(); double size = (file.length() / 1024.00); phototext.setText(filename + " (" + String.valueOf(size) + "KB)"); index++; break; } } if(e.getSource() == First) { index=0; phototext.setText(""); photo_name = list[index].getPath(); ImageIcon image_local2 = new ImageIcon(photo_name); Image imageget2 = image_local2.getImage(); Image finalimage2 = imageget2.getScaledInstance(Center.getWidth(), Center.getHeight(), Image.SCALE_AREA_AVERAGING); icon2 = new ImageIcon(finalimage2); imageview.setIcon(icon2); imageview.setBounds(50, 50, 500, 500); File file = new File(list[index].getName()); String filename = file.getName(); double size = (file.length() / 1024.00); phototext.setText(filename + " (" + String.valueOf(size) + "KB)"); } if(e.getSource() == Last) { index=list.length-1; phototext.setText(""); photo_name = list[index].getPath(); ImageIcon image_local2 = new ImageIcon(photo_name); Image imageget2 = image_local2.getImage(); Image finalimage2 = imageget2.getScaledInstance(Center.getWidth(), Center.getHeight(), Image.SCALE_AREA_AVERAGING); icon2 = new ImageIcon(finalimage2); imageview.setIcon(icon2); imageview.setBounds(50, 50, 500, 500); File file = new File(list[index].getName()); String filename = file.getName(); double size = (file.length() / 1024.00); phototext.setText(filename + " (" + String.valueOf(size) + "KB)"); } if (e.getActionCommand() == "打开图片") { int choose = chooser.showOpenDialog(null); if (choose == JFileChooser.APPROVE_OPTION) { phototext.setText(""); photo_name = chooser.getSelectedFile().getName(); ImageIcon image_local2 = new ImageIcon(photo_name); Image imageget2 = image_local2.getImage(); Image finalimage2 = imageget2.getScaledInstance(Center.getWidth(), Center.getHeight(), Image.SCALE_AREA_AVERAGING); icon2 = new ImageIcon(finalimage2); imageview.setIcon(icon2); imageview.setBounds(50, 50, 500, 500); File file = new File(chooser.getSelectedFile().getName()); String filename = file.getName(); double size = (file.length() / 1024.00); phototext.setText(filename + " (" + String.valueOf(size) + "KB)"); } } if (e.getActionCommand() == "播放") { String filePath = "./music"; try { System.out.print("运行了"); Runnable play = ( ) ->{ audio.run(); }; Thread t1 = new Thread(play); t1.start(); isPlaying = true; } catch (Exception e2) { // TODO Auto-generated catch block e2.printStackTrace(); } } if (e.getSource() == stop) { try { System.out.print("停止了"); isPlaying = false; isRestart = false; } catch (Exception e2) { // TODO Auto-generated catch block e2.printStackTrace(); } } if (e.getSource() == playnext) { try { System.out.print("下一个"); isPlaying = false; Runnable r =() ->{ try { someMethod(); index_music++; isRestart = true; audio.restart(); } catch (UnsupportedAudioFileException | IOException | LineUnavailableException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }; Thread t = new Thread(r); t.start(); } catch (Exception e2) { // TODO Auto-generated catch block e2.printStackTrace(); } } if (e.getSource() == playlast) { try { if(index_music == 0) { JOptionPane.showMessageDialog(West, "已经是第一首背景音乐", "提示", JOptionPane.WARNING_MESSAGE); } isPlaying = false; isRestart = true; } catch (Exception e2) { // TODO Auto-generated catch block e2.printStackTrace(); } } }; Thread act = new Thread(action); act.start(); } public class Audio extends Thread { public Audio() { } public void run() { try { Thread.sleep(100); } catch (InterruptedException e) { System.out.println(e.toString()); } if (isPlaying) { try { System.out.print("启动了"); player(); } catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) { e.printStackTrace(); } } } public void restart() throws UnsupportedAudioFileException, IOException, LineUnavailableException { if(isRestart) { System.out.print("测试了~?"); isPlaying =true; player(); } } // 取得文件输入流 private void player() throws UnsupportedAudioFileException, IOException, LineUnavailableException { AudioInputStream audioInputStream;// 文件流 AudioFormat audioFormat;// 文件格式 SourceDataLine sourceDataLine;// 输出设备 String musicname = musiclist[index_music].getName(); File file = new File("./music/"+musicname); audioInputStream = AudioSystem.getAudioInputStream(file); audioFormat = audioInputStream.getFormat(); // 转换文件编码 if (audioFormat.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) { audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, audioFormat.getSampleRate(), 16, audioFormat.getChannels(), audioFormat.getChannels() * 2, audioFormat.getSampleRate(), false); audioInputStream = AudioSystem.getAudioInputStream(audioFormat, audioInputStream); } // 打开输出设备 DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, audioFormat, AudioSystem.NOT_SPECIFIED); sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo); sourceDataLine.open(audioFormat); // 打开具有指定格式的行,这样可以使行获得所有所需的系统资源并变得可操作 sourceDataLine.start(); // 允许某一数据行执行数据I/O byte tempBuffer[] = new byte[320]; try { int cnt; // 读取数据到缓存区 // 从音频流读取指定的最大数量的数据字节,并将其放入给定的字节数组中。 // return: 读入缓冲区的总字节数;如果因为已经到达流末尾而不再有更多数据,则返回-1 while ((cnt = audioInputStream.read(tempBuffer, 0,tempBuffer.length)) != -1 &&isPlaying) { if (cnt > 0) { // 写入缓存数据 sourceDataLine.write(tempBuffer, 0, cnt); // 通过此源数据行将音频数据写入混频器 } } // Block等待临时数据被输出为空 // 通过在清空数据行的内部缓冲区之前继续数据I/O,排空数据行中的列队数据 sourceDataLine.drain(); // 关闭行,指示可以释放的该行使用的所有系统资源。如果此操作成功,则将行标记为 closed,并给行的侦听器指派一个 CLOSE 事件。 sourceDataLine.close(); } catch (Exception e) { e.printStackTrace(); System.exit(0); } } } public static void main(String[] args) { Runnable h = () ->{ HOME home = new HOME(); }; Thread t = new Thread(h); t.start(); } } ``` ```playnext那一部分是切下一首歌,但是切了后当前的歌曲仍在播放,怎么解决
写了个java多线程下载器,但只有文件的部分内容下载成功。求大神!
import java.net.*; import java.io.*; class Test { //定义文件大小 private static int fileLength; //定义文件保存路径 private static String fileDirection; //定义线程数量 private static int threadNum; //定义线程组 private static Threads[] threads; //定义资源下载路径 private static String webDirection; /** * 默认构造器 * */ public Test(){} /** * 构造器: * 初始化threadNum(线程数量),fileDirection(文件保存路径),webDirection(资源下载路径) * */ public Test(int threadNum, String fileDirection, String webDirection) { this.threadNum = threadNum; this.fileDirection = fileDirection; this.webDirection = webDirection; //初始化threads数量。 threads = new Threads[threadNum]; } public static void downLoad() throws Exception { URL url = new URL(webDirection); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("Accept", "*/*"); conn.setRequestProperty("Accept", "image/gif, image/jpeg, image/pjpeg, image/pjpeg, " + "application/x-shockwave-flash, application/xaml+xml, " + "application/vnd.ms-xpsdocument, application/x-ms-xbap, " + "application/x-ms-application, application/vnd.ms-excel, " + "application/vnd.ms-powerpoint, application/msword, */*"); conn.setRequestProperty("Charset", "UTF-8"); //获取连接 conn.connect(); //输出连接响应代码 System.out.println(conn.getResponseCode()); //获得文件大小 fileLength = conn.getContentLength(); //关闭连接 conn.disconnect(); //设置每条线程下载部分的大小 int subLength = fileLength / threadNum + 1; //设置本地文件的大小 RandomAccessFile file = new RandomAccessFile(fileDirection, "rw"); file.setLength(fileLength); file.close(); //以循环的方式来开始每一条线程 for (int i = 0; i < threadNum; i++) { //计算每条线程的下载的开始位置 int startPoint = i * subLength; //每条线程使用一个RandomAccessFile进行下载 RandomAccessFile subFile = new RandomAccessFile(fileDirection, "rw"); //定位该线程的下载位置 subFile.seek(startPoint); //初始化该线程 threads[i] = new Threads(subLength, startPoint, subFile, webDirection); //启动线程 threads[i].start(); } } } class Threads extends Thread { //定义该线程的下载位置 private static int startPoint; //当前线程需要下载的文件块 private static RandomAccessFile subFile; //定义资源的下载路径 private static String webDirection; //定义当前线程需要下载的问文件大小 private static int subLength; //定义已下载文件字节数 private static int length; /** * 构造器: * 初始化sublength,startPoint,subFile,webDirection * */ public Threads(int sublength, int startPoint, RandomAccessFile subFile, String webDirection) { this.startPoint = startPoint; this.subLength = sublength; this.subFile = subFile; this.webDirection = webDirection; } @Override public void run() { try { URL url = new URL(webDirection); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(1000); conn.setRequestProperty("Accept", "image/gif, image/jpeg, image/pjpeg, image/pjpeg, " + "application/x-shockwave-flash, application/xaml+xml, " + "application/vnd.ms-xpsdocument, application/x-ms-xbap, " + "application/x-ms-application, application/vnd.ms-excel, " + "application/vnd.ms-powerpoint, application/msword, */*"); conn.setRequestProperty("Accept-Language", "zh-CN"); conn.setRequestProperty("Charset", "UTF-8"); conn.connect(); //获取一个输出流, InputStream input = conn.getInputStream(); //是输出流跳过startpoint字节,表明该线程只下载自己负责的那一部分文件块 input.skip(startPoint); byte[] buffer = new byte[1024]; int hasNext = 0; //读取网络数据,并写入本地文件 while (length < subLength && (hasNext = input.read(buffer)) != -1) { subFile.write(buffer, 0, hasNext); //累计该线程的下载的总大小 length += hasNext; } input.close(); subFile.close(); } catch (Exception e) { } } } public class ThreadsDownload { public static void main(String[] args)throws Exception { // TODO Auto-generated method stub Test test = new Test(2, "C:\\Users\\Administrator\\Desktop\\music.txt", "http://shcm09.baidupcs.com/file/59980bec5eb499787dc6888f8c769620?bkt=p3-140059980bec5eb499787dc6888f8c769620847e32380000000003bc&fid=2283488641-250528-388951467231009&time=1484371050&sign=FDTAXGERLBH-DCb740ccc5511e5e8fedcff06b081203-%2FRxhx4PSo2A2tg6emD0bGTEM5DQ%3D&to=sh09vb&fm=Nan,B,M,mn&sta_dx=956&sta_cs=5&sta_ft=txt&sta_ct=0&sta_mt=0&fm2=Nanjing02,B,M,mn&newver=1&newfm=1&secfm=1&flow_ver=3&pkey=140059980bec5eb499787dc6888f8c769620847e32380000000003bc&sl=69926991&expires=8h&rt=pr&r=745301334&mlogid=314351329813847523&vuk=2283488641&vbdid=2298463801&fin=test.txt&fn=test.txt&slt=pm&uta=0&rtype=1&iv=0&isw=0&dp-logid=314351329813847523&dp-callid=0.1.1&csl=500&csign=Cfc%2B%2Bn4hgLFC3dLFpSY0MMKwS%2BE%3D"); test.downLoad(); }
用java实现:上传excl表格。读取数据,输出结果。
package chexianchaxun; import java.io.*; public class FeiYong{ public static void main(String[] args) throws Exception { java.net.URL url = new java.net.URL("http://********"); java.net.URLConnection con = url.openConnection(); con.setUseCaches(false); con.setDoOutput(true); con.setDoInput(true); DataOutputStream dataOut = new DataOutputStream(con.getOutputStream()); //字节流:InputStream(读取)、OutputStream(写入) String Msg = "<Request> <VinNo>ZAMJK39E6B0060491</VinNo><LicenseNo></LicenseNo><LoginID>215288</LoginID></Request>" ; /**转保车辆VinNo为必填 */ System.out.println(Msg); //字符流:Writer(写入)、Reader(读取) dataOut.write(Msg.getBytes("gbk"));//将已经解析出来的字节数据转化为gbk编码格式的字符串 dataOut.flush(); dataOut.close(); InputStream is = con.getInputStream(); InputStreamReader isr = new InputStreamReader(is, "gbk"); BufferedReader br = new BufferedReader(isr); StringBuffer sb = new StringBuffer(); String templine=null; while ((templine = br.readLine()) != null) sb.append(templine); System.out.println(sb.toString()); } } 如上。 当个输入信息车架号,通过接口,可以获取对应的数据信息。 现需要实现,excl表格形式上传,表格内有多条车辆的车架号数据,通过接口,然后再获取对应的数据信息。 感谢Always_MyLoverX 的耐心回答
这个实例怎么改才能让其正常运行
package IODemo; /*向文件中写入10个数据,第i个数据=圆周率*i(i=0,1,2,...,9),然后将第二个(i=2)改为 0,最后将10个数据全部输出*/ import java.io.IOException; import java.io.RandomAccessFile; public class TestFileRAF { public static void main(String[] args){ try{ RandomAccessFile f=new RandomAccessFile("TestFileRAF.txt","rw"); int i; double d; //写:向文件写入10个数据 for(i=0;i<10;i++){ //f.writeDouble()写入double数据的方法 f.writeDouble(Math.PI*i); //修改:对文件中第2个double数据改为0 f.seek(16);//文件针往前走16个字节(2个double数据);seek:寻找 f.writeDouble(0); f.seek(0);//文件指针回到文件首部 //读取:将全部数据独处并打印到屏幕中 for(i=0;i<10;i++){ d=f.readDouble(); System.out.println("["+i+"]:"+d); } f.close(); } }catch (IOException e){ System.err.println("发现异常:"+e); e.printStackTrace(); } } } ![图片说明](https://img-ask.csdn.net/upload/201605/07/1462610917_438600.jpg)
JAVA编写HTTP下载遇到难题了,望各位给个思路
我用Java 编写了一个HTTP下载的程序,通过Socket建立链接,发送请求和接收文件。现在在接收文件的时候出现了问题,接收的数据中包含了HTTP响应信息,即: <br />HTTP/1.1 200 OK <br />Date: Sun, 02 Aug 2009 08:49:22 GMT <br />Server: Apache/2.2.11 (Unix) mod_ssl/2.2.11 OpenSSL/0.9.8k DAV/2 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 <br />Last-Modified: Thu, 04 Jun 2009 15:36:14 GMT <br />ETag: "78878f-49e-46b87893bd780" <br />Accept-Ranges: bytes <br />Content-Length: 1182 <br />Connection: close <br />Content-Type: text/plain <br /> <br /> <br />我想把这段过滤掉,因为这不是文件本身应有的数据,各位有什么好的方法吗? <br /> <br />我试过的方法:附加的代码中方法download()。把读取的字节流转成字符串,判断两个“回车换行”的位置,取子字符串再转成字节保存。虽然这方法能把把这段响应信息过滤掉,但是打开文件显示已损坏,我想应该是转为字符串时编码出了问题,导致再转回字节时出了问题。 <br /> <br /> <br /> <br />附上我的源代码,请各位给个思路 <br /><pre name="code" class="java"> package net; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.Arrays; import java.util.List; public class HTTPDownload { /** * 过滤响应字符串; */ public static void download() throws IOException{ //建立Socket链接 Socket socket = new Socket("www.chentaoqian.com",80); //构造请求字符串 StringBuffer sb = new StringBuffer(); sb.append("GET ").append("/test.rar ").append("HTTP/1.1\r\n"); sb.append("Host:www.chentaoqian.com\r\n"); sb.append("Accept:*/*\r\n"); sb.append("User-Agent:GeneralDownloadApplication\r\n"); sb.append("Connection:close\r\n\r\n"); // System.out.println("send command."); //发送请求 OutputStream socketOut = socket.getOutputStream(); socketOut.write(sb.toString().getBytes()); socket.shutdownOutput(); // System.out.println("start receive."); //开始接收数据 InputStream socketIn = socket.getInputStream(); ByteArrayOutputStream buffer = new ByteArrayOutputStream(); byte[] buff = new byte[1024]; int len = -1; boolean flag = false; //标识是否已完成响应信息过滤;true-完成,false-未完成 String temp = ""; while((len=socketIn.read(buff))!=-1){ if(flag == false){ //过滤响应信息; //因为响应信息出现在响应流的一开始并且以两个回车换行结束("\r\n\r\n"),所以以此做判断; temp += new String(buff); if(temp.indexOf("\r\n\r\n") != -1){ // buff = temp.substring(temp.indexOf("\r\n\r\n")+4).getBytes(); // len = buff.length; buffer.write(buff, temp.indexOf("\r\n\r\n"), temp.substring(temp.indexOf("\r\n\r\n")+4).getBytes().length); flag = true; } continue; }else{ buffer.write(buff,0,len); } } System.out.println(buffer.toString()); //将数据写入文件保存; File f = new File("./aaaa.rar"); FileOutputStream fos = new FileOutputStream(f); buffer.writeTo(fos); fos.close(); socketIn.close(); socketOut.close(); socket.close(); System.out.println("文件保存到:"+f.getAbsolutePath()); } /** * 没有过滤响应字符串; */ public static void download2() throws IOException{ //建立Socket链接 Socket socket = new Socket("www.chentaoqian.com",80); //构造请求字符串 StringBuffer sb = new StringBuffer(); sb.append("GET ").append("/test.rar ").append("HTTP/1.1\r\n"); sb.append("Host:www.chentaoqian.com\r\n"); sb.append("Accept:*/*\r\n"); sb.append("User-Agent:GeneralDownloadApplication\r\n"); sb.append("Connection:close\r\n\r\n"); // System.out.println("send command."); //发送请求 OutputStream socketOut = socket.getOutputStream(); socketOut.write(sb.toString().getBytes()); socket.shutdownOutput(); // System.out.println("start receive."); //开始接收数据 InputStream socketIn = socket.getInputStream(); ByteArrayOutputStream buffer = new ByteArrayOutputStream(); byte[] buff = new byte[1024]; int len = -1; while((len=socketIn.read(buff))!=-1){ buffer.write(buff,0,len); } // System.out.println(buffer.toString()); //将数据写入文件保存; File f = new File("./aaaa2.rar"); FileOutputStream fos = new FileOutputStream(f); buffer.writeTo(fos); fos.close(); socketIn.close(); socketOut.close(); socket.close(); System.out.println("文件保存到:"+f.getAbsolutePath()); } /** * @param args */ public static void main(String[] args) throws Exception { HTTPDownload.download(); // HTTPDownload.download2(); } } </pre><br/><strong>问题补充</strong><br/><div class="quote_title">beckrabbit 写道</div><div class="quote_div">http下载程序 干嘛要用socket建立连接?</div> <br />那要怎么做比较好,我是因为看到关于socket发送HTTP请求的文章才想到用socket读取数据。 <br />beckrabbit可以给个思路吗?
ByteArrayOutputStream 里的问题
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;//为什么-8?Integer的MAX_VALUE在32位系统中位2^15-1,在64位系统中位2^31-1 ``` package ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.util.Arrays; /** * 字符缓冲流 * @author Administrator * */ public class MyByteArrayOutputStream extends OutputStream{ public byte buf[];//字节缓冲区 public int count;//写入的字节数 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;//为什么-8?Integer的MAX_VALUE在32位系统中位2^15-1,在64位系统中位2^31-1 public MyByteArrayOutputStream() { this(32);//初始值为啥是32 } public MyByteArrayOutputStream(int size){ if(size < 0){ throw new IllegalArgumentException("错误的初始化大小" + size); } buf = new byte[size]; } private void ensureCapacity(int minCapacity){ if(minCapacity - buf.length > 0){//r如果将要添加的值超过了byte的数组的长度将原数组增长 grow(minCapacity); } } private void grow(int minCapacity){//2^30+1 2^31 int oldCapacity = buf.length;//2^30 2^31-1 int newCapacity = oldCapacity << 1;//容量增长为原来的两倍2^31 if(newCapacity - minCapacity < 0){ newCapacity = minCapacity;//新增长的容量小于添加后的实际容量,将容量增长为实际容量 } if(newCapacity - MAX_ARRAY_SIZE > 0){//新增长的容量大于最大容量 newCapacity = hugeCapacity(minCapacity); } System.out.println(newCapacity); buf = Arrays.copyOf(buf,newCapacity);//将数组的内容考到新的数组中 } private static int hugeCapacity(int minCapacity){ if(minCapacity < 0){ throw new OutOfMemoryError();//内存溢出,为什么要抛出内存溢出 } return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;//设置数组的最大容量为Integer.MAX_VAL } public synchronized void write(int b){ ensureCapacity(count + 1); buf[count] = (byte)b; count +=1; } public synchronized void write(byte b [],int off,int len){ if((off < 0) || (off > b.length) || (len < 0) || ((off + len ) - b.length > 0)){ throw new IndexOutOfBoundsException(); } ensureCapacity(count + len); System.arraycopy(b, off, buf, count, len); count +=len; } public synchronized void writeTo(OutputStream out)throws IOException{ out.write(buf, 0, count); } public synchronized void reset(){ count = 0; } public synchronized byte toByteArray()[]{ return Arrays.copyOf(buf, count); } public synchronized int size(){ return count; } public synchronized String toString(){ return new String(buf,0,count); } public synchronized String toString(String charsetName) throws UnsupportedEncodingException{ return new String(buf,0,count,charsetName); } @Deprecated public synchronized String toString(int hibyte){ return new String(buf,hibyte,0,count); } public void close() throws IOException{} } ```
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
使用 Docker 部署 Spring Boot 项目
Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下。首先构建一个简单的 S...
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
redis分布式锁,面试官请随便问,我都会
文章有点长并且绕,先来个图片缓冲下! 前言 现在的业务场景越来越复杂,使用的架构也就越来越复杂,分布式、高并发已经是业务要求的常态。像腾讯系的不少服务,还有CDN优化、异地多备份等处理。 说到分布式,就必然涉及到分布式锁的概念,如何保证不同机器不同线程的分布式锁同步呢? 实现要点 互斥性,同一时刻,智能有一个客户端持有锁。 防止死锁发生,如果持有锁的客户端崩溃没有主动释放锁,也要保证锁可以正常释...
项目中的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 进程负责处...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Java世界最常用的工具类库
Apache Commons Apache Commons有很多子项目 Google Guava 参考博客
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下...
为什么要学数据结构?
一、前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
Android 9.0 init 启动流程
阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android本篇文章主要介绍Android开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:一、启动流程概述一、 启动流程概述Android启动流程跟Linux启动类似,大致分为如下五个阶段。1.开机上电,加载固化的ROM。2.加载BootLoader,拉起Android OS。3.加载Uboot,初始外设,引导Kernel启动等。...
相关热词 c#委托 逆变与协变 c#新建一个项目 c#获取dll文件路径 c#子窗体调用主窗体事件 c# 拷贝目录 c# 调用cef 网页填表c#源代码 c#部署端口监听项目、 c#接口中的属性使用方法 c# 昨天
立即提问