InputStream to String,编码格式设置为GBK应该怎么操作

由于在使用ORACLE和iReport,但是iReport里面不支持CLOB,我又写了个类,把CLOB字段指定为InputStream,然后通过转换变成String。
英文是可以的,但是中文就不行了,以下是部分代码:

public String inputStream2String (InputStream in) throws IOException {
StringBuffer out = new StringBuffer();

byte[]  b  =  new  byte[4096]; 
for  (int  n;  (n  =  in.read(b))  !=  -1;)  { 
        out.append(new  String(b,  0,  n)); 
} 

  return out.toString(); 

}
里面加这么一句:
String clob = new String(out.toString().getBytes("iso8859-1"),"gb2312");
return clob;
返回的还是乱码。
怎么做下编码格式的转换?分不多,但是很急,希望大家能帮忙。
[b]问题补充:[/b]
to lovewhzlq:
不行,还是乱码。
[b]问题补充:[/b]
to layer555:
谢谢,有变化,但还是乱码。
是不是InputStream to byte 的过程也要转下?
[b]问题补充:[/b]
to ywbanm:
是GB2312,IR是一种报表软件,似乎只支持UTF-8,于是我把项目编码改成UTF-8,代码里也写成UTF-8,一样还是乱码。
谢谢 :oops:
[b]问题补充:[/b]
最后还是使用了Object的方式解决了乱码的问题,谢谢大家。

6个回答

从你贴的代码看,是在从ORACLE读出的时候就乱码了,和iReport似乎没有关系(不知道你的数据是如何入库的)。

所以你现在能确定,

1,数据入到ORACLE是正常的么?

2,GB2312是ORACLE的编码还是你开发环境的?

3,out.toString().getBytes("JVM编码"),"ORACLE的编码"

4,‘把CLOB字段指定为InputStream’,你确定这个InputStream打开的编码方式正确么?

你DB的Encoding是什么?
你开发环境的Encoding又是什么?

为什么不统一呢。都用UTF8不就什么事都没有了么

用InputStreamReader包装一下InputStream

[code="java"]
public String inputStream2String (InputStream in , String encoding) throws IOException {
StringBuffer out = new StringBuffer();
InputStreamReader inread = new InputStreamReader(in,encoding);

    char[]  b  =  new  char[4096];
    for  (int  n;  (n  =  inread.read(b))  !=  -1;)  {
            out.append(new  String(b,  0,  n));
    }

      return out.toString();
} 

[/code]

String clob = new String(out.toString().getBytes(),"gb2312"); 把第一个编码去掉试试

你先把自己环境用的编码方式搞清楚,要不大家帮你一块猜也没用

我遇到一个奇怪的问题,怎么转都乱码,最后是因为gzip的问题,在这里解决了![url]http://www.sojson.com/blog/227.html[/url]

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
在myeclipse的工程的编码是UTF-8,下面的代码怎么样修改才能不乱吗?
我在myeclipse的工程的编码是UTF-8,我不想改工程的编码方式,下面的代码怎么样修改才能不乱吗?高手给指点下,很困惑。,不要说修改myeclipse里面的设置,这种方式我这里行不通。我有个应用不能修改myeclipse配置。 public static void main(String[] args) throws Exception { // 获得输入流 InputStream in = System.in; // 获得转换流 InputStreamReader isr = new InputStreamReader(in); // 获得缓冲流 BufferedReader br = new BufferedReader(isr); System.out.print("请输入学生姓名:"); // 得到键盘输入 String name = br.readLine(); System.out.println(name);// 打印结果是乱码 System.out.println(new String(name.getBytes("GBK"), "UTF-8")); // 键盘录入中文是奇数时会有乱码,偶数时没有。 }
inputStream中read()疑问求解
ApI说read()方法返回一个0-255之间的int值,如果被读取的文件存储的是文字比如"你好" 那么返回的字节(默认编码表=GBK)不应该是负数么?(被读取文件编码是GBK) 我在Java中试了一下,被读取文件是你好,返回的是四个正数,而我设定一个 String s="你好"; byte[]bytes=s.getBytes(); for(byte b:bytes){ System.out.println(b); }得到的是四个负数(-60,-29,-70,-61) 小白一枚,请通俗易懂一些
用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 的耐心回答
又见乱码,url写成文件
简单描述下问题 需要将url生成静态页面 服务器是 apache+tomcat 乱码都处理过了,包括web.xml里的设置,过滤器的设置,apache转发的设置。 整个系统不存在页面显示的乱码问题。 如果是以上问题的回答,请不要回答。 现在的问题是,需要将一个地址转换成html文件,已便于其它程序(一个邮件订阅系统)使用。 [code="java"] import java.io.BufferedReader; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Writer; import java.net.MalformedURLException; import java.net.URL; public class UrlToHtml { public static void main(String[] args) { String content = readUrlContent("http://www.investide.cn/edm/index.do"); //http://www.investide.cn/edm/index.do用的是gbk编码 try{ content = new String(content.getBytes(), "GBK"); System.out.println(content); if (!(writeFile(content, "/home/mush/1.html"))) { System.out.println("文件生成失败"); } }catch(Exception e){ e.printStackTrace(); } } public static String readUrlContent(String url) { StringBuffer sb = new StringBuffer(); try { String strLine; URL urlObj = new URL(url); InputStream streamObj = urlObj.openStream(); InputStreamReader readerObj = new InputStreamReader(streamObj,"GBK"); BufferedReader buffObj = new BufferedReader(readerObj); while ((strLine = buffObj.readLine()) != null) sb.append(strLine + "\r"); buffObj.close(); } catch (MalformedURLException e) { System.err.println("url error"); } catch (IOException e) { System.out.println("IO error"); } return sb.toString(); } public static boolean writeFile(String str, String filePath) { boolean result = true; try { //FileWriter fw = new FileWriter(filePath); Writer fw = new OutputStreamWriter(new FileOutputStream (filePath),"GBK"); fw.write(str); fw.close(); } catch (IOException e) { result = false; System.out.println("写文件失败"); } return result; } } [/code] 开始程序在本地运行没有任何问题,放到服务器上后,生成的文件就会乱码,然后加了几处乱码处理(见三处GBK编码),仍然显示时乱码。 服务器用的是redhat,i18n文件已设置过GBK编码。 能处理的地方都处理过了,不明白为什么还有问题。 望指教。。。 [b]问题补充:[/b] Tomcat的server.xml也设置过了。 整个系统不存在页面显示的乱码问题。 如果是以上问题的回答,请不要回答。
java 模拟HTTP doPost请求 设置参数
最近做一接口,要通过JAVA类请求SERVLET ,DOPOST方法. 不知道怎么把我的参数传过去.在网上找了几个例子. 都不行. 方法一: [code="java"] package com.3sfg.setvlet; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.URIException; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.params.HttpMethodParams; import org.apache.commons.httpclient.util.URIUtil; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * HTTP工具箱 * * @author leizhimin 2009-6-19 16:36:18 */ public final class HttpTookit { private static Log log = LogFactory.getLog(HttpTookit.class); /** * 执行一个HTTP GET请求,返回请求响应的HTML * * @param url 请求的URL地址 * @param queryString 请求的查询参数,可以为null * @param charset 字符集 * @param pretty 是否美化 * @return 返回请求响应的HTML */ public static String doGet(String url, String queryString, String charset, boolean pretty) { StringBuffer response = new StringBuffer(); HttpClient client = new HttpClient(); HttpMethod method = new GetMethod(url); try { if (StringUtils.isNotBlank(queryString)) //对get请求参数做了http请求默认编码,好像没有任何问题,汉字编码后,就成为%式样的字符串 method.setQueryString(URIUtil.encodeQuery(queryString)); client.executeMethod(method); if (method.getStatusCode() == HttpStatus.SC_OK) { BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), charset)); String line; while ((line = reader.readLine()) != null) { if (pretty) response.append(line).append(System.getProperty("line.separator")); else response.append(line); } reader.close(); } } catch (URIException e) { log.error("执行HTTP Get请求时,编码查询字符串“" + queryString + "”发生异常!", e); } catch (IOException e) { log.error("执行HTTP Get请求" + url + "时,发生异常!", e); } finally { method.releaseConnection(); } return response.toString(); } /** * 执行一个HTTP POST请求,返回请求响应的HTML * * @param url 请求的URL地址 * @param params 请求的查询参数,可以为null * @param charset 字符集 * @param pretty 是否美化 * @return 返回请求响应的HTML */ public static String doPost(String url, Map<String, String> params, String charset, boolean pretty) { StringBuffer response = new StringBuffer(); HttpClient client = new HttpClient(); HttpMethod method = new PostMethod(url); //设置Http Post数据 if (params != null) { HttpMethodParams p = new HttpMethodParams(); for (Map.Entry<String, String> entry : params.entrySet()) { p.setParameter(entry.getKey(), entry.getValue()); } p.setParameter("abc", "efg"); method.setParams(p); } try { client.executeMethod(method); if (method.getStatusCode() == HttpStatus.SC_OK) { BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), charset)); String line; while ((line = reader.readLine()) != null) { if (pretty) response.append(line).append(System.getProperty("line.separator")); else response.append(line); } reader.close(); } } catch (IOException e) { log.error("执行HTTP Post请求" + url + "时,发生异常!", e); } finally { method.releaseConnection(); } return response.toString(); } public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); map.put("parax", "123456"); String y = doGet("http://127.0.0.1:8080/AIRP/servletTest", "xx=00", "GBK", true); String z = doPost("http://127.0.0.1:8080/AIRP/servletTest?", map, "GBK", false); System.out.println(y); System.out.println(z); } }[/code] POST 方法 ,我在servletJ里,取不知任何参数,请求帮助. 感谢. 方法二: [code="java"] private static String testPost(String MSG_ID,String MOBILE_NO,String CONTENT, String SERVICE_ID,String PASS,String SP_CODE,String LINK_ID, String FEE_TYPE,String FEE_CODE) throws IOException { URL url = new URL("http://127.0.0.1:8080/AIRP/servletTest"); URLConnection connection = url.openConnection(); connection.setDoOutput(true); OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "utf-8"); out.write("MSG_ID="+MSG_ID+"&MOBILE_NO="+MOBILE_NO+"&ACTION_ID=3" +"&SERVICE_ID=99&PASS=asdfasd" +"&SP_CODE=10625777&LINK_ID="); //向页面传递数据。post的关键所在! // remember to clean up out.flush(); out.close(); String sCurrentLine; String sTotalString; sCurrentLine = ""; sTotalString = ""; InputStream l_urlStream; l_urlStream = connection.getInputStream(); // 传说中的三层包装阿! BufferedReader l_reader = new BufferedReader(new InputStreamReader( l_urlStream)); while ((sCurrentLine = l_reader.readLine()) != null) { sTotalString += sCurrentLine + "\r\n"; } System.out.println(sTotalString); return sTotalString; } [/code] if (params != null) { HttpMethodParams p = new HttpMethodParams(); for (Map.Entry<String, String> entry : params.entrySet()) { p.setParameter(entry.getKey(), entry.getValue()); } p.setParameter("abc", "efg"); method.setParams(p); } 这样不知道怎么取不到参数...
Java编码的相关问题
今天在写代码的过程中遇到一个问题,跟大家讨论讨论. properties配置文件中的中文注释全是ascii码形式的,看不懂,就想写段代码来转换成gbk或utf-8形式的中文: public static String ascii2ChineseDesc(String asciiStr){ if(asciiStr==null){ return "传入的字符串为空!"; } return new String(asciiStr.getBytes()); } 在调用传参的时候传入ascii码字符串参数,能正确显示为中文.就这样凑合用着. 后来发现配置文件中的中文注释太多,这样一段一段的转换太费时了,所以干脆就用io流来读取配置文件,每读一行就调用 上面的方法一次来转换成中文. while ((res = reader.readLine()) != null) { buf.append(new String(res.getBytes()) + "\n"); } 最后打印buf.toString()时,那些ascii码没有被转换成中文.试了一些方法都不行,如果你直接给定一个字符串,比如 String str = "\u5206\u5272"; 然后System.out.println(new String(str.getBytes()));它还是能转换成中文,但是只要是通过BufferedReader读出来的 就是转换不了.我想是不是由于properties文件编码的问题(默认是:ISO-8859-1),目前还没有解决这个问题.希望在论坛上大家都能 讨论一下. IO流读取源码: public static String getPropFileChineseDES(String fileName) { /** * 把字节流转换为字符流,InputStreamReader是字节流与字符流转换的桥梁 */ InputStream stream = CommonDemo.class.getClassLoader().getResourceAsStream(fileName); InputStreamReader in = new InputStreamReader(stream); BufferedReader reader = new BufferedReader(in); BufferedWriter writer = null; String res = "---------------------------文件[" + fileName+ "]---------------------------\n"; StringBuffer buf = new StringBuffer(res); try { File f = new File("info.txt"); writer = new BufferedWriter(new FileWriter("info.txt"));//相对路径:相对于工程根目录来说 while ((res = reader.readLine()) != null) { buf.append(new String(res.getBytes()) + "\n"); } writer.write(buf.toString()); writer.flush(); System.out.println(f.getAbsolutePath()); } catch (IOException e) { e.printStackTrace(); return e.getMessage(); }finally{ try { if(reader!=null){ reader.close(); } if(writer!=null){ writer.close(); } } catch (IOException e) { e.printStackTrace(); } } return buf.toString(); }
Geotools 创建shape文件报错,无法设置中文属性
feature.setAttribute(0, polygon.getCode()); 这个属性名乱码,如果设置成中文就报错 eg: feature.setAttribute("图斑编码", polygon.getCode()); ``` package com.kero99.utils; /** * 创建shape文件 * @author ygc * */ import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Serializable; import java.io.StringReader; import java.io.StringWriter; import java.net.MalformedURLException; import java.net.URLEncoder; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.geotools.data.FeatureWriter; import org.geotools.data.FileDataStore; import org.geotools.data.FileDataStoreFinder; import org.geotools.data.Transaction; import org.geotools.data.shapefile.ShapefileDataStore; import org.geotools.data.shapefile.ShapefileDataStoreFactory; import org.geotools.data.shapefile.dbf.DbaseFileHeader; import org.geotools.data.shapefile.dbf.DbaseFileReader; import org.geotools.data.shapefile.files.ShpFiles; import org.geotools.data.simple.SimpleFeatureCollection; import org.geotools.data.simple.SimpleFeatureIterator; import org.geotools.data.simple.SimpleFeatureSource; import org.geotools.feature.IllegalAttributeException; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.geotools.feature.type.Types; import org.geotools.geojson.feature.FeatureJSON; import org.geotools.geojson.geom.GeometryJSON; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.geotools.util.Converters; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.Point; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.feature.type.AttributeDescriptor; import com.kero99.patterns.IShape; import com.kero99.pojo.Zdesignpolygon; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.MultiPolygon; import net.sf.json.JSONArray; import net.sf.json.JSONObject; /** * Geotools文档:http://docs.geotools.org/latest/javadocs/ * 创建shape文件 * @author ygc * */ public class createShapeFile { public static void main(String[] args) throws IOException { //创建文件路径 String path="C:\\新建文件夹\\y.shp"; File file=new File(path); //创建坐标 String str="{\"type\":\"MultiPolygon\",\"coordinates\":[[[[125.00088033726706,43.40147359017337],[124.99679348328742,43.401096616676305],[124.99694837503591,43.40186442431018],[124.99750584741349,43.401955866321565],[124.99803787708493,43.40230992248794],[124.9980525639301,43.40490599341744],[124.99939124766493,43.4039525077194],[124.999703712491,43.4048699875539],[124.99866141203354,43.40606649155232],[125.00126143620331,43.40562431171862],[125.00257777597052,43.403552077651824],[125.00295876012552,43.40274710316431],[125.00307123554897,43.40186767450569],[125.00088033726706,43.40147359017337]]]]}"; JSONObject jsonObject = JSONObject.fromObject(str); JSONArray jsonArray = jsonObject.getJSONArray("coordinates"); System.out.println(jsonArray); //创建对象添加属性信息 Zdesignpolygon polygon=new Zdesignpolygon(); polygon.setCode("106"); polygon.setCoordinate(str); polygon.setMark("tktt3"); polygon.setName("土坎梯田"); polygon.setState("坡耕地"); polygon.setNumber(12.64); polygon.setSlope(9.0); //添加创建的路径 Map<String, Serializable> params = new HashMap<String, Serializable>(); params.put(ShapefileDataStoreFactory.URLP.key, file.toURI().toURL()); ShapefileDataStoreFactory sf = new ShapefileDataStoreFactory(); //创建shape文件数据仓库根据工厂 ShapefileDataStore ds = (ShapefileDataStore) sf.createDataStore(file.toURI().toURL()); ds.setCharset(Charset.forName("GBK")); //ShapefileDataStore ds = (ShapefileDataStore) new ShapefileDataStoreFactory().createDataStore(params); //创建要素模板 SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder(); //设置wgs84格式 tb.setCRS(DefaultGeographicCRS.WGS84); //设置全局状态 tb.setName("shapefile"); //添加属性类型 tb.add("图斑编码", String.class); tb.add("措施代码", String.class); tb.add("措施名称", String.class); tb.add("利用现状", String.class); tb.add("措施数量", Double.class); tb.add("坡度", Double.class); tb.add("the_geom", MultiPolygon.class); //设置FeatureType数据存储。该方法将删除任何现有的本地资源或抛出IOException如果远程数据存储。 //这个元素附加源和附加Javadoc,因此没有能找到Javadoc。 ds.createSchema(tb.buildFeatureType()); //设置编码格式 //     类似的API FeatureReader后,调查组成员功能使用next()你可以叫删除()或修改后写()。 // 如果你不调用这两个方法调用之前hasNext(),或下(),这个功能将被修改的。 //   这个API允许修改,编写和基于过滤器的修改。请参阅ContentDataStore使用这个API实现共同opperations的例子。 // FeatureWriter<SimpleFeatureType, SimpleFeature> featureWriter = ds.getFeatureWriter(ds.getTypeNames()[0], Transaction.AUTO_COMMIT); FeatureWriter<SimpleFeatureType, SimpleFeature> featureWriter = ds.getFeatureWriter(ds.getTypeNames()[0], null); // FeatureWriter<SimpleFeatureType, SimpleFeature> featureWriter = ds.getFeatureWriter(Transaction.AUTO_COMMIT); SimpleFeature feature = featureWriter.next(); // 取出特征里面的属性集合 //添加属性值和坐标 feature.setAttribute(0, polygon.getCode()); feature.setAttribute(1, polygon.getMark()); feature.setAttribute(2, polygon.getName()); feature.setAttribute(3, polygon.getState()); feature.setAttribute(4, polygon.getNumber()); feature.setAttribute(5, polygon.getSlope()); //转换geojson GeometryJSON geometryJSON2 = new GeometryJSON(15); Geometry geometry = geometryJSON2.read(new StringReader(polygon.getCoordinate())); feature.setAttribute("the_geom", geometry); featureWriter.write(); featureWriter.close(); ds.dispose(); } protected boolean validating; protected Map<String, String> index; protected SimpleFeatureType featureType; protected Object[] values; public SimpleFeatureType getFeatureType() { return this.featureType; } // public void setAttribute(String name, Object value) { // String idx = this.index.get(name); // if (idx == null) { // throw new IllegalAttributeException("Unknown attribute " + name); // } else { // this.setAttribute(idx, value); // } // } } ```
关于HttpClient的问题,如何使用HttpClient重定向?
``` /* * HttpRequestProxy.java * * Created on November 3, 2008, 9:53 AM */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.SimpleHttpConnectionManager; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; public class HttpRequestProxy { // 超时间隔 private static int connectTimeOut = 60000; // 让connectionmanager管理httpclientconnection时是否关闭连接 private static boolean alwaysClose = false; // 返回数据编码格式 private String encoding = "UTF-8"; private final HttpClient client = new HttpClient(); public HttpClient getHttpClient() { return client; } /** * 用法: HttpRequestProxy hrp = new HttpRequestProxy(); * hrp.doRequest("http://www.163.com",null,null,"gbk"); * * @param url * 请求的资源URL * @param postData * POST请求时form表单封装的数据 没有时传null * @param header * request请求时附带的头信息(header) 没有时传null * @param encoding * response返回的信息编码格式 没有时传null * @return response返回的文本数据 * @throws CustomException */ public String doRequest(String url, Map postData, Map header, String encoding) throws Exception { String responseString = null; // 头部请求信息 Header[] headers = null; if (header != null) { Set entrySet = header.entrySet(); int dataLength = entrySet.size(); headers = new Header[dataLength]; int i = 0; for (Iterator itor = entrySet.iterator(); itor.hasNext();) { Map.Entry entry = (Map.Entry) itor.next(); headers[i++] = new Header(entry.getKey().toString(), entry.getValue().toString()); } } // post方式 if (postData != null) { PostMethod postRequest = new PostMethod(url.trim()); if (headers != null) { for (int i = 0; i < headers.length; i++) { postRequest.setRequestHeader(headers[i]); } } Set entrySet = postData.entrySet(); int dataLength = entrySet.size(); NameValuePair[] params = new NameValuePair[dataLength]; int i = 0; for (Iterator itor = entrySet.iterator(); itor.hasNext();) { Map.Entry entry = (Map.Entry) itor.next(); params[i++] = new NameValuePair(entry.getKey().toString(), entry.getValue().toString()); } postRequest.setRequestBody(params); try { responseString = this.executeMethod(postRequest, encoding); } catch (Exception e) { throw e; } finally { postRequest.releaseConnection(); } } return responseString; } private String executeMethod(HttpMethod request, String encoding) throws Exception { String responseContent = null; InputStream responseStream = null; BufferedReader rd = null; try { this.getHttpClient().executeMethod(request); if (encoding != null) { responseStream = request.getResponseBodyAsStream(); rd = new BufferedReader(new InputStreamReader(responseStream, encoding)); String tempLine = rd.readLine(); StringBuffer tempStr = new StringBuffer(); String crlf = System.getProperty("line.separator"); while (tempLine != null) { tempStr.append(tempLine); tempStr.append(crlf); tempLine = rd.readLine(); } responseContent = tempStr.toString(); } else responseContent = request.getResponseBodyAsString(); Header locationHeader = request.getResponseHeader("location"); // 返回代码为302,301时,表示页面己经重定向,则重新请求location的url,这在 // 一些登录授权取cookie时很重要 if (locationHeader != null) { String redirectUrl = locationHeader.getValue(); this.doRequest(redirectUrl, null, null, null); } } catch (HttpException e) { throw new Exception(e.getMessage()); } catch (IOException e) { throw new Exception(e.getMessage()); } finally { if (rd != null) try { rd.close(); } catch (IOException e) { throw new Exception(e.getMessage()); } if (responseStream != null) try { responseStream.close(); } catch (IOException e) { throw new Exception(e.getMessage()); } } return responseContent; } /** * 特殊请求数据,这样的请求往往会出现redirect本身而出现递归死循环重定向 所以单独写成一个请求方法 * 比如现在请求的url为:http://localhost:8080/demo/index.jsp 返回代码为302 * 头部信息中location值为:http://localhost:8083/demo/index.jsp * 这时httpclient认为进入递归死循环重定向,抛出CircularRedirectException异常 * * @param url * @return * @throws CustomException */ public String doSpecialRequest(String url, int count, String encoding) throws Exception { String str = null; InputStream responseStream = null; BufferedReader rd = null; GetMethod getRequest = new GetMethod(url); // 关闭httpclient自动重定向动能 getRequest.setFollowRedirects(false); try { this.client.executeMethod(getRequest); Header header = getRequest.getResponseHeader("location"); if (header != null) { // 请求重定向后的URL,count同时加1 this.doSpecialRequest(header.getValue(), count + 1, encoding); } // 这里用count作为标志位,当count为0时才返回请求的URL文本, // 这样就可以忽略所有的递归重定向时返回文本流操作,提高性能 if (count == 0) { getRequest = new GetMethod(url); getRequest.setFollowRedirects(false); this.client.executeMethod(getRequest); responseStream = getRequest.getResponseBodyAsStream(); rd = new BufferedReader(new InputStreamReader(responseStream, encoding)); String tempLine = rd.readLine(); StringBuffer tempStr = new StringBuffer(); String crlf = System.getProperty("line.separator"); while (tempLine != null) { tempStr.append(tempLine); tempStr.append(crlf); tempLine = rd.readLine(); } str = tempStr.toString(); } } catch (HttpException e) { throw new Exception(e.getMessage()); } catch (IOException e) { throw new Exception(e.getMessage()); } finally { getRequest.releaseConnection(); if (rd != null) try { rd.close(); } catch (IOException e) { throw new Exception(e.getMessage()); } if (responseStream != null) try { responseStream.close(); } catch (IOException e) { throw new Exception(e.getMessage()); } } return str; } public static void main(String[] args) throws Exception { HttpRequestProxy hrp = new HttpRequestProxy(); Map date = new HashMap(); date.put("jyidApplet", "1"); date.put("codeNumApplet", "1"); date.put("jymxIdApplet", "447"); date.put("patientIdApplet", "1118"); String str = hrp.doRequest("http://127.0.0.1:8080/lis/mz/addTM",date, null, null); System.out.println(str); } } ```
服务器端下载多张图片,保存到本地,现在只能保存一张图片
服务端代码: resp.setContentType("text/html;charset=UTF-8"); // 得到下载用户的名字 String name=req.getParameter("name"); //下载的所有图片 ArrayList<String> downList=UserDbUtil.getInstance().downloadPIC(DbUtil.openDb(), name); FileInputStream fis=null; OutputStream toClient=null; for (int i = 0; i < downList.size(); i++) { System.out.println("下载图片的路径:"+downList.get(i)); // 解决中文乱码问题 String filename = new String(downList.get(i).getBytes( "iso-8859-1"), "UTF-8"); // 创建file对象 File file = new File(filename); // 设置response的编码方式 resp.setContentType("application/x-msdownload"); // 写明要下载的文件的大小 resp.setContentLength((int) file.length()); // 设置附加文件名 // response.setHeader("Content-Disposition","attachment;filename="+filename); // 解决中文乱码 resp.setHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes("gbk"), "iso-8859-1")); // 读出文件到i/o流 fis = new FileInputStream(file); BufferedInputStream buReader = new BufferedInputStream(fis); byte[] b = new byte[1024];// 相当于我们的缓存 // 从response对象中得到输出流,准备下载 toClient = resp.getOutputStream(); int num; // 开始循环下载 while ((num = buReader.read(b)) != -1) { // 将b中的数据写到客户端的内存 toClient.write(b, 0, num); } // 将写入到客户端的内存的数据,刷新到磁盘 toClient.flush(); toClient.close(); fis.close(); System.out.println("下载图片到本地。。。。"); } android代码: /** * 下载图像方法 * * @param url * @return */ public static Bitmap downloadBitmap(String url) { Bitmap bitmap = null; HttpGet get = new HttpGet(url);// 下载地址 // 客户端对象 HttpClient client = new DefaultHttpClient(); try { HttpResponse resp = client.execute(get); if (resp.getStatusLine().getStatusCode() == 200) { // 连接成功,获取下载的数据流 InputStream in = resp.getEntity().getContent(); // 将数据流转为图像并返回(注意大图处理) bitmap = BitmapFactory.decodeStream(in); //获取长度 in.close();// 关闭流 Log.e("nnnnnnn", "服务器下载到图片"); } client.getConnectionManager().shutdown(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 执行连接获取结果 return bitmap; }
http Client 出现生僻字
<pre name="code" class="java"> //cookie HttpSession session=request.getSession(); Object cookie=null; cookie=session.getAttribute(KEY_COOKIE); //设置header PostMethod method = new PostMethod(url); if(cookie!=null){ method.setRequestHeader("Cookie", ""+cookie); } Enumeration en=request.getHeaderNames(); while(en.hasMoreElements()){ String n=(String)en.nextElement(); String v=request.getHeader(n); method.setRequestHeader(n, v); } method.setRequestHeader("content-length", ""+content.getBytes().length); System.out.println("[RailUtil]Request:\n" + content + "\n"); //设置内容 method.setRequestBody(content); method.setRequestHeader("Content-type", "text/xml; charset=GBK"); //Client org.apache.commons.httpclient.HttpClient client = new org.apache.commons.httpclient.HttpClient(); client.getParams().setContentCharset("GBK"); //设置超时 5秒 client.setTimeout(TIMEOUT); //发送请求 try { client.executeMethod(method); } catch (HttpException e1) { // TODO Auto-generated catch block e1.printStackTrace(); throw new Exception("连接超时或信道错误",e1); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); throw new Exception("连接超时或信道错误",e1); } //保存 cookie Header newCookieHeader = method.getResponseHeader("Set-Cookie"); if(newCookieHeader!=null) session.setAttribute(KEY_COOKIE, newCookieHeader.getValue()); //输出返回 StringBuilder sb_res=new StringBuilder(); InputStream bis=null; try{ bis=method.getResponseBodyAsStream(); byte[] bb=new byte[1024]; int len_res=0; while((len_res=bis.read(bb))&gt;0){ //bb = new String(bb, "GB2312").getBytes("GBK"); sb_res.append(new String(bb,0,len_res)); } }catch(IOException e){ throw new Exception("读取返回信息失败",e); }finally{ if(bis!=null)bis.close(); } </pre> <p> </p> <p>代码如上,应该可以看得明白。现在问题是返回的字符串,我是用xml格式存放信息,其中部分中文字被转换为生僻字,这个是什么原因呢?</p><br /><strong>问题补充:</strong><br />to lovewhzlq <br />如何指定正确的编码呢?返回的字符串可以检测到编码方式么?
java根据模板修改内容后,生成word,修改后内容中文乱码
Java code package com.sunyard.test; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Date; public class OperatorRTF { /** * 字符串转换为rtf编码 * * @param content * @return */ public String strToRtf(String content) { try { System.out.println(content); content=new String(content.getBytes(),"GB2312"); System.out.println(content); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } char[] digital = "0123456789ABCDEF".toCharArray(); StringBuffer sb = new StringBuffer(""); byte[] bs = null; bs = content.getBytes(); int bit; for (int i = 0; i < bs.length; i++) { bit = (bs[i] & 0x0f0) >> 4; sb.append("\\'"); sb.append(digital[bit]); bit = bs[i] & 0x0f; sb.append(digital[bit]); } return sb.toString(); } /** * 替换文档的可变部分 * * @param content * @param replacecontent * @param flag * @return */ public String replaceRTF(String content, String replacecontent, int flag) { String rc = strToRtf(replacecontent); String target = ""; System.out.println(rc); if (flag == 0) { target = content.replace("$timetop$", rc); } if (flag == 1) { target = content.replace("$info$", rc); } if (flag == 2) { target = content.replace("$idea$", rc); } if (flag == 3) { target = content.replace("$advice$", rc); } if (flag == 4) { target = content.replace("$infosend$", rc); } return target; } /** * 获取文件路径 * * @param flag * @return */ public String getSavePath() { String path = "D:\\"; File fDirecotry = new File(path); if (!fDirecotry.exists()) { fDirecotry.mkdirs(); } return path; } /** * 半角转为全角 */ public String ToSBC(String input) { char[] c = input.toCharArray(); for (int i = 0; i < c.length; i++) { if (c[i] == 32) { c[i] = (char) 12288; continue; } if (c[i] < 127) { c[i] = (char) (c[i] + 65248); } } return new String(c); } public void rgModel(String username, String content) { /* 构建生成文件名 targetname:12时10分23秒_username_记录.rtf */ Date current = new Date(); SimpleDateFormat sdf = new java.text.SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); String targetname = sdf.format(current).substring(11, 13) + "时"; targetname += sdf.format(current).substring(14, 16) + "分"; targetname += sdf.format(current).substring(17, 19) + "秒"; targetname += "_" + username + "_记录.doc"; /* 字节形式读取模板文件内容,将结果转为字符串 */ String strpath = getSavePath(); String sourname = strpath + "\\" + "档案利用登记单.rtf"; String sourcecontent = ""; InputStream ins = null; try { ins = new FileInputStream(sourname); byte[] b = new byte[1024]; if (ins == null) { System.out.println("源模板文件不存在"); } int bytesRead = 0; while (true) { bytesRead = ins.read(b, 0, 1024); // return final read bytes // counts if (bytesRead == -1) {// end of InputStream System.out.println("读取模板文件结束"); break; } // convert to string using bytes sourcecontent += new String(b, 0, bytesRead); } } catch (Exception e) { e.printStackTrace(); } /* 修改变化部分 */ String targetcontent = ""; /** * 拆分之后的数组元素与模板中的标识符对应关系 array[0]:timetop array[1]:info array[2]:idea * array[3]:advice array[4]:infosend */ String array[] = content.split("~"); // 2008年11月27日:更新模板之后时间无需自动填充 for (int i = 0; i < array.length; i++) { if (i == 0) { targetcontent = replaceRTF(sourcecontent, array[i], i); } else { targetcontent = replaceRTF(targetcontent, array[i], i); } } /* 结果输出保存到文件 */ try { FileWriter fw = new FileWriter(getSavePath() + "\\" + targetname, true); PrintWriter out = new PrintWriter(fw); System.out.println(targetcontent); if (targetcontent.equals("") || targetcontent == "") { out.println(sourcecontent); } else { out.println(targetcontent); } out.close(); fw.close(); System.out.println(getSavePath() + " 该目录下生成文件" + targetname + " 成功"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { OperatorRTF oRTF = new OperatorRTF(); // 被替换内容以"~"符号分割,处理的时候将其拆分为数组即可 String content = "2008Y10M12D9H-2008Y10M12D6H~idea~look~我们参照检验药品的方法~we"; oRTF.rgModel("cheney", content); } } 上面的代码是我在网上找到的一种java操作word的方法 java读取word文档时,虽然网上介绍了很多插件poi、java2Word、jacob、itext等等,poi无法读取格式(新的API估计行好像还在处于研发阶段,不太稳定,做项目不太敢用);java2Word、jacob容易报错找不到注册,比较诡异,我曾经在不同的机器上试过,操作方法完全一致,有的机器不报错,有的报错,去他们论坛找高人解决也说不出原因,项目部署用它有点玄;itxt好像写很方便但是我查了好久资料没有见到过关于读的好办法。经过一番选择还是折中点采用rtf最好,毕竟rtf是开源格式,不需要借助任何插件,只需基本IO操作外加编码转换即可。rtf格式文件表面看来和doc没啥区别,都可以用word打开,各种格式都可以设定。 ----- 实现的功能:读取rtf模板内容(格式和文本内容),替换变化部分,形成新的rtf文档。 ----- 实现思路:模板中固定部分手动输入,变化的部分用$info$表示,只需替换$info$即可。 1、采用字节的形式读取rtf模板内容 2、将可变的内容字符串转为rtf编码 3、替换原文中的可变部分,形成新的rtf文档 这是原作者的想法,可我在使用过程中,发现替换内容中(我们参照检验药品的方法)这个中文,是不能显示的,在word里,把它转换成了iso-8859-1的编码了,不能正常显示中文,我都不知道应该在哪设置编码,才能让它正常显示,原word模板中的中文,可以正常显示,应该是在读取word模板的时候,把编码方式也读进去了,现在就是想请教一下前辈们,应该如何后,自己修改的那些中文,也可以正常显示呢 [b]问题补充:[/b] 汗,这里好象自己不能回复,所以我以这种形式回复。 先感谢一楼,二楼的回答,昨天我有事,请假没上班,所以没能及时回复,先道个歉。 先回答1楼的,在写的时候,我设置编码的话,感觉是无效的,不管我怎么设置,都没用。 再回答2楼的,特别说一下,我试了一下,发现生成的word里,那些修改部分的中文的编码形式改变了,只是还是乱码。后来我把unicode,ISO-8859-1,UTF-8,GB2312,GBK,甚至ASCII都试过了, word里都是不同形式的乱码,就是不出现汉字,真闷,我感觉是在 bs = content.getBytes("unicode"); 后,系统后来又默认的把这把转成了ISO-8859-1的形式. 可是 bs = content.getBytes("ISO-8859-1"); 我这么设置,word里的汉字是????? 真不知道为什么,要是ISO-8859-1,转ISO-8859-1,应该不会改变的哎 希望高手们,能继续解答,谢谢 [b]问题补充:[/b] 汪兆铭,您好,我不知道您一直观注这个问题,我以为要过会才能看到您的回答,所以,现在才刷新了这个页面,不好意思,先道个歉。 现在回到问题中,我照您的意思, bs = content.getBytes("unicode"); 改了一下,然后输入,可是依然不能正常显示中文,是不是,在哪,还需要再转换一次呢? [b]问题补充:[/b] mirzlm@126.com 谢谢,不知道与jdk版本或是什么的没有关系 [b]问题补充:[/b] 汪兆铭,您好,我看了一下您发的东西,我发现了问题的所在,竟然是在表格单元格里面的,就替换出来的是乱码,在表格单元格外面的,是可以正常显示的,您可以去试试,把替换的那个,放在表格里,看看,会不会成功,谢谢你的帮助 [b]问题补充:[/b] 谢谢您,给我这么多的帮助,那应该是我的那个rtf模板的问题了,真的很感谢,谢谢,谢谢,再谢谢
URLConnection传递参数后的问题
现在有需求需要用java的URLConnection发送请求并传递参数,就在网上找了代码来研究。代码如下: [color=green]import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import org.apache.log4j.Logger; /** * <pre> * HTTP请求[qing qiu]代理类 * </pre> * * @author benl * @version 1.0, 2007-7-3 */ public class HttpRequestProxy { /** * 连接[lian jie]超时[chao shi] */ private static int connectTimeOut = 5000; /** * 读取[du qu]数据[shu ju]超时[chao shi] */ private static int readTimeOut = 10000; /** * 请求[qing qiu]编码[bian ma] */ private static String requestEncoding = "GBK"; private static Logger logger = Logger.getLogger(HttpRequestProxy.class); /** * <pre> * 发送带参数[can shu]的GET的HTTP请求[qing qiu] * </pre> * * @param reqUrl * HTTP请求[qing qiu]URL * @param parameters * 参数[can shu]映射[ying she]表 * @return HTTP响应[xiang ying]的字符[zi fu]串[zi fu chuan] */ public static String doGet(String reqUrl, Map parameters, String recvEncoding) { HttpURLConnection url_con = null; String responseContent = null; try { StringBuffer params = new StringBuffer(); for (Iterator iter = parameters.entrySet().iterator(); iter .hasNext();) { Entry element = (Entry) iter.next(); params.append(element.getKey().toString()); params.append("="); params.append(URLEncoder.encode(element.getValue().toString(), HttpRequestProxy.requestEncoding)); params.append("&"); } if (params.length() > 0) { params = params.deleteCharAt(params.length() - 1); } URL url = new URL(reqUrl); url_con = (HttpURLConnection) url.openConnection(); url_con.setRequestMethod("GET"); System.setProperty("sun.net.client.defaultConnectTimeout", String .valueOf(HttpRequestProxy.connectTimeOut));// (单位[dan // wei]:毫秒)jdk1.4换成这个,连接[lian // jie]超时[chao // shi] System.setProperty("sun.net.client.defaultReadTimeout", String .valueOf(HttpRequestProxy.readTimeOut)); // (单位[dan // wei]:毫秒)jdk1.4换成这个,读操作超时[chao // shi] // url_con.setConnectTimeout(5000);//(单位[dan wei]:毫秒)jdk // 1.5换成这个,连接[lian jie]超时[chao shi] // url_con.setReadTimeout(5000);//(单位[dan wei]:毫秒)jdk // 1.5换成这个,读操作超时[chao shi] url_con.setDoOutput(true); byte[] b = params.toString().getBytes(); url_con.getOutputStream().write(b, 0, b.length); url_con.getOutputStream().flush(); url_con.getOutputStream().close(); InputStream in = url_con.getInputStream(); BufferedReader rd = new BufferedReader(new InputStreamReader(in, recvEncoding)); String tempLine = rd.readLine(); StringBuffer temp = new StringBuffer(); String crlf = System.getProperty("line.separator"); while (tempLine != null) { temp.append(tempLine); temp.append(crlf); tempLine = rd.readLine(); } responseContent = temp.toString(); rd.close(); in.close(); } catch (IOException e) { logger.error("网络[wang luo]故障[gu zhang]", e); } finally { if (url_con != null) { url_con.disconnect(); } } return responseContent; } /** * <pre> * 发送不带参数[can shu]的GET的HTTP请求[qing qiu] * </pre> * * @param reqUrl * HTTP请求[qing qiu]URL * @return HTTP响应[xiang ying]的字符[zi fu]串[zi fu chuan] */ public static String doGet(String reqUrl, String recvEncoding) { HttpURLConnection url_con = null; String responseContent = null; try { StringBuffer params = new StringBuffer(); String queryUrl = reqUrl; int paramIndex = reqUrl.indexOf("?"); if (paramIndex > 0) { queryUrl = reqUrl.substring(0, paramIndex); String parameters = reqUrl.substring(paramIndex + 1, reqUrl .length()); String[] paramArray = parameters.split("&"); for (int i = 0; i < paramArray.length; i++) { String string = paramArray[i]; int index = string.indexOf("="); if (index > 0) { String parameter = string.substring(0, index); String value = string.substring(index + 1, string .length()); params.append(parameter); params.append("="); params.append(URLEncoder.encode(value, HttpRequestProxy.requestEncoding)); params.append("&"); } } params = params.deleteCharAt(params.length() - 1); } URL url = new URL(queryUrl); url_con = (HttpURLConnection) url.openConnection(); url_con.setRequestMethod("GET"); System.setProperty("sun.net.client.defaultConnectTimeout", String .valueOf(HttpRequestProxy.connectTimeOut));// (单位[dan // wei]:毫秒)jdk1.4换成这个,连接[lian // jie]超时[chao // shi] System.setProperty("sun.net.client.defaultReadTimeout", String .valueOf(HttpRequestProxy.readTimeOut)); // (单位[dan // wei]:毫秒)jdk1.4换成这个,读操作超时[chao // shi] // url_con.setConnectTimeout(5000);//(单位[dan wei]:毫秒)jdk // 1.5换成这个,连接[lian jie]超时[chao shi] // url_con.setReadTimeout(5000);//(单位[dan wei]:毫秒)jdk // 1.5换成这个,读操作超时[chao shi] url_con.setDoOutput(true); byte[] b = params.toString().getBytes(); url_con.getOutputStream().write(b, 0, b.length); url_con.getOutputStream().flush(); url_con.getOutputStream().close(); InputStream in = url_con.getInputStream(); BufferedReader rd = new BufferedReader(new InputStreamReader(in, recvEncoding)); String tempLine = rd.readLine(); StringBuffer temp = new StringBuffer(); String crlf = System.getProperty("line.separator"); while (tempLine != null) { temp.append(tempLine); temp.append(crlf); tempLine = rd.readLine(); } responseContent = temp.toString(); rd.close(); in.close(); } catch (IOException e) { logger.error("网络[wang luo]故障[gu zhang]", e); } finally { if (url_con != null) { url_con.disconnect(); } } return responseContent; } /** * <pre> * 发送带参数[can shu]的POST的HTTP请求[qing qiu] * </pre> * * @param reqUrl * HTTP请求[qing qiu]URL * @param parameters * 参数[can shu]映射[ying she]表 * @return HTTP响应[xiang ying]的字符[zi fu]串[zi fu chuan] */ public static String doPost(String reqUrl, Map parameters, String recvEncoding) { HttpURLConnection url_con = null; String responseContent = null; try { StringBuffer params = new StringBuffer(); for (Iterator iter = parameters.entrySet().iterator(); iter .hasNext();) { Entry element = (Entry) iter.next(); params.append(element.getKey().toString()); params.append("="); params.append(URLEncoder.encode(element.getValue().toString(), HttpRequestProxy.requestEncoding)); params.append("&"); } if (params.length() > 0) { params = params.deleteCharAt(params.length() - 1); } URL url = new URL(reqUrl); url_con = (HttpURLConnection) url.openConnection(); url_con.setRequestMethod("POST"); System.setProperty("sun.net.client.defaultConnectTimeout", String .valueOf(HttpRequestProxy.connectTimeOut));// (单位[dan // wei]:毫秒)jdk1.4换成这个,连接[lian // jie]超时[chao // shi] System.setProperty("sun.net.client.defaultReadTimeout", String .valueOf(HttpRequestProxy.readTimeOut)); // (单位[dan // wei]:毫秒)jdk1.4换成这个,读操作超时[chao // shi] // url_con.setConnectTimeout(5000);//(单位[dan wei]:毫秒)jdk // 1.5换成这个,连接[lian jie]超时[chao shi] // url_con.setReadTimeout(5000);//(单位[dan wei]:毫秒)jdk // 1.5换成这个,读操作超时[chao shi] url_con.setDoOutput(true); byte[] b = params.toString().getBytes(); url_con.getOutputStream().write(b, 0, b.length); url_con.getOutputStream().flush(); url_con.getOutputStream().close(); InputStream in = url_con.getInputStream(); BufferedReader rd = new BufferedReader(new InputStreamReader(in, recvEncoding)); String tempLine = rd.readLine(); StringBuffer tempStr = new StringBuffer(); String crlf = System.getProperty("line.separator"); while (tempLine != null) { tempStr.append(tempLine); tempStr.append(crlf); tempLine = rd.readLine(); } responseContent = tempStr.toString(); rd.close(); in.close(); } catch (IOException e) { logger.error("网络[wang luo]故障[gu zhang]", e); } finally { if (url_con != null) { url_con.disconnect(); } } return responseContent; } /** * @return 连接[lian jie]超时[chao shi](毫秒) * @see com.hengpeng.common.web.HttpRequestProxy#connectTimeOut */ public static int getConnectTimeOut() { return HttpRequestProxy.connectTimeOut; } /** * @return 读取[du qu]数据[shu ju]超时[chao shi](毫秒) * @see com.hengpeng.common.web.HttpRequestProxy#readTimeOut */ public static int getReadTimeOut() { return HttpRequestProxy.readTimeOut; } /** * @return 请求[qing qiu]编码[bian ma] * @see com.hengpeng.common.web.HttpRequestProxy#requestEncoding */ public static String getRequestEncoding() { return requestEncoding; } /** * @param connectTimeOut * 连接[lian jie]超时[chao shi](毫秒) * @see com.hengpeng.common.web.HttpRequestProxy#connectTimeOut */ public static void setConnectTimeOut(int connectTimeOut) { HttpRequestProxy.connectTimeOut = connectTimeOut; } /** * @param readTimeOut * 读取[du qu]数据[shu ju]超时[chao shi](毫秒) * @see com.hengpeng.common.web.HttpRequestProxy#readTimeOut */ public static void setReadTimeOut(int readTimeOut) { HttpRequestProxy.readTimeOut = readTimeOut; } /** * @param requestEncoding * 请求[qing qiu]编码[bian ma] * @see com.hengpeng.common.web.HttpRequestProxy#requestEncoding */ public static void setRequestEncoding(String requestEncoding) { HttpRequestProxy.requestEncoding = requestEncoding; } public static void main(String[] args) { Map map = new HashMap(); map.put("actionType", "1"); map.put("issueId", "33"); String temp = HttpRequestProxy.doGet( "http://localhost/TransData", map, "GBK"); System.out.println("返回的消息[xiao xi]是:" + temp); } }[/color] 最后mian方法中这段 String temp = HttpRequestProxy.doGet("http://localhost/TransData", map, "GBK"); 里面的URL是我另外新建的一个web工程,名为TransData。在TransData工程中的index.jsp页面我这样写: [color=green]<% String p1 = request.getParameter("actionType"); String p2 = request.getParameter("issueId"); System.out.println("p1:"+p1); System.out.println("p2:"+p2); %>[/color] 但是发现我拿不到参数。 就把提交的URL改为提交到servlet: String temp = HttpRequestProxy.doGet("http://localhost/TransData/a.do", map, "GBK"); 在servlet的doPost方法中这样写: [color=green] String p1 = req.getParameter("actionType"); String p2 = req.getParameter("issueId"); System.out.println(p1); System.out.println(p2);[/color] 这样打印p1,p2发现可以拿到值。这是为什么呢,为什么在jsp中拿不到参数,在servlet中却可以拿到?
properties文件内容的unicode转换(提问)
[size=medium]在开发过程中,为了使开发出来的代码更健壮、更灵活,我们常常把一些常变的变量写 <br />入到配置文件中。而在这些配置文件中,properties文件是使用的比较多的,它不仅配置起 <br />来简单(一个key=value形式即可),而且在对文件的操作中也比较方便。 <br />&nbsp; <br />&nbsp;&nbsp;&nbsp; 由于字符的编码问题以及properties文件在国际化的使用过程中,我们常常需要将文件 <br />内容转换为unicode码。以免从文件里取出的内容为乱码。 <br /> <br />&nbsp;&nbsp;&nbsp; 解决上面问题,我们一般采用一些如 properties editor 形式的插件。现在我写了一段 <br />类似properties editor的转码程序(转换为unicode码)。大致功能是:从一个properties文件里逐行读出一字符串(有可能是注释,也有可能是 'key=value' 形式的属性配置)。然后将属性配置行的value转换为unicode码,转换完后写入到另一个文件里。 <br /><span style="color: blue"> <br />&nbsp;&nbsp;&nbsp; 现在的问题是,上面功能能完成,即可以把properties文件转换成一个内容为unicode的 <br />properties文件(后面称unicode文件)。但是,在从unicode文件读文件配置内容时候,就会报错,或根本就不能通过Properties.load(in)的形式加载文件。希望您能花点时间,帮我解决这个问题。</span> <br /> <br />&nbsp;&nbsp;&nbsp; 也许我描述的不太清楚,现在我贴出部分代码,您先看看,知道我的大概意思,然后把整 <br />个工程下载到你本地,你帮我调试一下。先说明一下,对这个问题,我研究了好几天,实在找 <br />不到解决问题的方法,才贴出的。请大家别责怪我不思考就贴出问题来。 <br /> <br /><pre name="code" class="java">package com.tja.code; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.util.LinkedList; import java.util.Properties; import java.util.Queue; import com.tja.util.StringUtil; import com.tja.util.file.CREATE_METHOD; import com.tja.util.file.FileUtil; /** * 将properties文件内容换成Unicode码形式的properties文件 * * */ public class UnicodeUtil { /** * unicode码前缀 */ private static final String UNICODE_PREFIX = "\\u"; /** * 文件内容注释标志 */ private static final String COMMENTS_PREFIX = "#"; /** * 属性(properties)文件中的等于 '=' 符号 */ private static final String EQUAL_SIGNAL = "="; public static void propFile2Unicode(String fileName) throws FileNotFoundException, IOException { //Assert.notNull(fileName); propFile2Unicode(new File(fileName),null); } /** * 将属性文件里内容转换为unicode码(只将文件里的value转换为unicode,而key值不变)。 * 实现逻辑: 逐行读取文件内容,对每行内容进行转码(转成unicode形式),对转码的内容 * 又存入一队列中。最后使用队列先进先出的特点将所有内容写入一新的文件里, * 即fileName. * @param file * 属性文件(properties文件) * @param fileName * 记录转码后内容的文件名 * @throws FileNotFoundException * @throws IOException */ public static void propFile2Unicode(File file,String fileName) throws FileNotFoundException, IOException { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String unicodeValue; Queue&lt;String&gt; queue = new LinkedList&lt;String&gt;(); while((line = br.readLine())!=null) { unicodeValue = value2unicode(line); //对读出的一行内容进行转码 queue.add(unicodeValue); } br.close(); //如果没指定文件名,则将内容写入原文件里 String filePath = StringUtil.hasLength(fileName)?fileName:file.getAbsolutePath(); write2file(filePath,queue); } /** * 将一行字符串转换成unicode形式。注意,分了注释和非注释的处理,注释 * 的内容也要转换成unicode形式 * * @param str * 字符串 * @return */ public static String value2unicode(String str) { return str.startsWith(COMMENTS_PREFIX)?dealWithComments(str):dealWithNonComments(str); } /** * 对注释内容进行转换成unicode,注释符号'#'不作处理 * * @param comments * 注释字符串,形式为 '#abccom好' * @return */ public static String dealWithComments(String comments) { //Assert.notNull(comments); if(!comments.startsWith(COMMENTS_PREFIX)) { throw new IllegalArgumentException("the parameter["+comments+"] is not comments!"); } String comment = comments.substring(1); return COMMENTS_PREFIX+GBK2Unicode(comment); } /** * 对非注释的一行字符串进行unicode转码,该字符串格式要求为key=value形式 * 即如:userName=xiaoxin。否则会抛出异常 * * @param non_comments * 非注释字符串 * @return */ public static String dealWithNonComments(String non_comments) { if(null == non_comments || 0 == non_comments.trim().length()) { return ""; } if(non_comments.startsWith(COMMENTS_PREFIX)) { throw new IllegalArgumentException("the parameter["+non_comments+"] is comments!"); } int index = non_comments.indexOf(EQUAL_SIGNAL); if(index == -1) { throw new IllegalArgumentException("the parameter["+non_comments+"] has no '=' !"); } String key = non_comments.substring(0,index+1); String value = non_comments.substring(index+1); return key+GBK2Unicode(value); } /** * 将队列内容写入指定文件里 * * @param filePath * @param queue * @throws IOException */ private static void write2file(String filePath,Queue&lt;String&gt; queue) throws IOException { //Assert.hasText(filePath); FileUtil.createFullPathFile(filePath, CREATE_METHOD.OVERWRITE); while(!queue.isEmpty()) { String content = queue.poll(); FileUtil.write2File(filePath, true,null, content+"\n"); } } /** * 字符串类型转换为Unicode * @param str * @return */ public static String GBK2Unicode(String str) { if(null == str) { return ""; } StringBuffer buf = new StringBuffer(UNICODE_PREFIX); for(int i = 0;i&lt;str.length();i++) { buf.append(char2Unicode(str.charAt(i))); if(i != str.length()-1) { buf.append(UNICODE_PREFIX); } } return buf.toString(); } /** * char类型转换为Unicode * @param ch * @return */ public static String char2Unicode(char ch) { return Integer.toString(ch, 16); } public static void main(String[] args) throws FileNotFoundException, IOException { String str = "D:/bb.properties"; String str1 = "D:/cc.properties"; String ss = "项目额度"; UnicodeUtil.propFile2Unicode(new File(str),str1); String g = UnicodeUtil.GBK2Unicode(ss); System.out.println(g); InputStream in = new FileInputStream(new File(str1)); Properties p = new Properties(); p.load(in); System.out.println(p.getProperty("FMS.loader.project")); System.out.println(p.getProperty("FMS.chinese")); } } </pre> <br /> <br />&nbsp; 请大家有时间帮忙看看。哦运行报的错误如下: <br /> <br /> <span style="color: red">&nbsp;&nbsp; Exception in thread "main" java.lang.IllegalArgumentException: Malformed \uxxxx encoding. <br /> at java.util.Properties.loadConvert(Unknown Source) <br /> at java.util.Properties.load(Unknown Source) <br /> at com.tja.code.UnicodeUtil.main(UnicodeUtil.java:175)</span>[/size]<br/><strong>问题补充</strong><br/><div class="quote_title">helin 写道</div><div class="quote_div">load的时候指定编码</div> <br /> <br /> <br />恕小弟愚笨,请问load的时候怎么指定编码呢?能给点例示代码吗?
谁用过commons-httpclient.jar,使用它来下载文件?
谁用过commons-httpclient.jar,使用它来下载文件? 下面是我的代码,放在main方法中可直接运行 [code="java"] String url = "http://lrc.aspxp.net/lrc.asp?id=291415&id1=174&t=lrc&ac=dl"; HttpClient http = new HttpClient(); //http.getHostConfiguration().setProxy("128.96.176.200",8089)); //http.getParams().setContentCharset("GBK"); GetMethod method = new GetMethod(); URI uri = new URI(url, false, "GBK"); method.setURI(uri); http.executeMethod(method); System.out.println(method.getResponseCharSet()); Header header = method.getResponseHeader("Content-Disposition"); System.out.println(header);//打印出Content-Disposition: attachment; filename=?????? - ??????????.lrc [/code] 我想通过预先读Header中的Content-Disposition读出将要下载的文件名。但始终是乱码 我该怎么办,怎么转码都不行。用InputStream is = m.getResponseBodyAsStream()可以读出body,编码通过GBK转一下就正常了,但没有 getResponseHeaderAsStream()这样的方法,我该怎么读Header中的文件名,请帮忙看看!(我用下载工具访问这个地址都能识别出正确的文件名,奇怪了?)。
java 关于解压rar文件 代码有点问题 帮改正
[color=red]问题:目前这个代码执行第一次的时候就可以解压rar文件,但是第二次就无效了。测试可以执行一次后servlet操作,删除解压后解压后的文件,在执行,rar文件就不解压了。我用的是tomcat服务器。 [/color] 文件1:UnrarServlet 代码 [code="java"] package com.jh.upload.servlet; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; @SuppressWarnings("serial") public class UnrarServlet extends HttpServlet { private static String unrarCmd = "C:\\Program Files\\WinRAR\\unrar x"; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @SuppressWarnings( { "static-access", "deprecation" }) public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("gbk"); response.setContentType("text/html;charset=gbk"); // 设置字符编码为UTF-8, 这样支持汉字显示 response.setCharacterEncoding("gbk"); //文件名 传进来或者取过来 String file = "系统管理.rar"; PrintWriter out = response.getWriter(); String rarFileName = request.getRealPath("/test") + "\\" + file; String destDir = request.getRealPath("/test"); File f = new File(rarFileName); if ((!f.exists()) && (f.length() <= 0)) { out.println("要解压的文件不存在!<p />"); out.println("<a href='MyJsp.jsp' >返回</a>"); return; } unrarCmd += " " + rarFileName + " " + destDir; try { Runtime rt = Runtime.getRuntime(); Process p = rt.exec(unrarCmd); StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(),"ERROR"); errorGobbler.start(); StreamGobbler outGobbler = new StreamGobbler(p.getInputStream(),"STDOUT"); // kick off stdout outGobbler.start(); p.waitFor(); System.out.println("进程:--"+p.exitValue()); } catch (Exception e) { System.out.println(e.getMessage()); } //判断目录是否存在 String fileName = file.substring(0, file.lastIndexOf(".")); File filePath = new File(destDir + "\\" + fileName); if (filePath.isDirectory()) { out.println("<p />解压成功!"); } else { out.println("<p />解压失败,请手工解压!"); } out.println("<p /><a href='MyJsp.jsp' >返回</a>"); return; } } [/code] 文件2:StreamGobbler.java [code="java"] import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; public class StreamGobbler extends Thread { InputStream is; String type; OutputStream os; StreamGobbler(InputStream is, String type) { this(is, type, null); } StreamGobbler(InputStream is, String type, OutputStream redirect) { this.is = is; this.type = type; this.os = redirect; } public void run() { try { PrintWriter pw = null; if (os != null) pw = new PrintWriter(os); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String line = null; while ((line = br.readLine()) != null) { if (pw != null) pw.println(line); System.out.println(type + ">" + line); } if (pw != null) pw.flush(); } catch (IOException ioe) { ioe.printStackTrace(); } } } [/code] [b]问题补充:[/b] 我之前也用 java-unrar-0.2 这种方式。但是没有弄好。 这个例子给我灵感了,谢谢。 ----------------------------------------------- public class Test { /** * 解压缩rar文件 * * @param rarFileName * @param extPlace */ public static boolean decompressionRarFiles(String rarFileName, String extPlace) { boolean flag = false; Archive archive = null; File out = null; File file = null; File dir = null; FileOutputStream os = null; FileHeader fh = null; String path, dirPath = ""; try { file = new File(rarFileName); archive = new Archive(file); } catch (RarException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } finally { if (file != null) { file = null; } } if (archive != null) { try { fh = archive.nextFileHeader(); while (fh != null) { path = (extPlace + fh.getFileNameString().trim()).replaceAll("\\\\", "/"); int end = path.lastIndexOf("/"); if (end != -1) { dirPath = path.substring(0, end); } try { dir = new File(dirPath); if (!dir.exists()) { dir.mkdirs(); } } catch (RuntimeException e1) { e1.printStackTrace(); } finally { if (dir != null) { dir = null; } } if (fh.isDirectory()) { fh = archive.nextFileHeader(); continue; } out = new File(extPlace + fh.getFileNameString().trim()); try { os = new FileOutputStream(out); archive.extractFile(fh, os); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (RarException e) { e.printStackTrace(); } finally { if (os != null) { try { os.close(); } catch (IOException e) { e.printStackTrace(); } } if (out != null) { out = null; } } fh = archive.nextFileHeader(); } } catch (RuntimeException e) { e.printStackTrace(); } finally { fh = null; if (archive != null) { try { archive.close(); } catch (IOException e) { e.printStackTrace(); } } } flag = true; } return flag; } public static void main(String[] args) { String absPath="D:\\apache-tomcat-6.0.20\\webapps\\upload\\test\\系统管理.rar"; //文件绝对目录 String toPath ="D:\\apache-tomcat-6.0.20\\webapps\\upload\\test\\"; //文件目录 boolean flag = new Test().decompressionRarFiles(absPath, toPath); System.out.println("flag ---"+flag); } } -------------------------------------------------------------- 上边是实现方式可以看一下。
html2pdf导出,windows下正常,linux下乱吗
本来直接用的jsoup,换了linux后乱码了,最后发现linux下读取个文件都乱码 linux下网页内容字节流保存本地xml文件正常没有乱码,然后读取文件就乱码了, 各位大神这啥原因啊,代码里编码都对应的,windows下都正常的,换linux就乱码了 public String convert2PDF() { PdfContentByte content = null; BaseFont base = null; Rectangle pageRect = null; String pdfPath = context .getRealPath("/pdfIn/" + (new SimpleDateFormat("yyyyMMddHHmmssSSS") .format(new Date()) + ".pdf")); String outPath = context .getRealPath("/pdfOut/" + (new SimpleDateFormat("yyyyMMddHHmmssSSS") .format(new Date()) + ".pdf")); String fontPath = context.getRealPath("/font/msyh.ttf"); String contextPath = context.getContextPath(); // FileOutputStream fos; InputStream is; try { jsp = jsp == null ? "" : jsp; // URL url = new URL(jsp); byte bytes[] = new byte[1024 * 1000]; String tmpXml = context.getRealPath("/tmpXml/" + (new SimpleDateFormat("yyyyMMddHHmmssSSS") .format(new Date()) + ".html")); File xml = new File(tmpXml); if (!xml.getParentFile().exists()) xml.getParentFile().mkdirs(); if (!xml.exists()) xml.createNewFile(); int index = 0; is = url.openStream(); int count = is.read(bytes, index, 1024 * 100); while (count != -1) { index += count; count = is.read(bytes, index, 1); } fos = new FileOutputStream(xml); System.out.println(index); fos.write(bytes, 0, index); // is.close(); fos.close(); FileInputStream fis = new FileInputStream(xml); InputStreamReader isr = new InputStreamReader(fis, "utf-8"); BufferedReader br = new BufferedReader(isr); StringBuffer sb = new StringBuffer(); String line = ""; while ((line = br.readLine()) != null) { sb.append(line); } br.close(); System.err.println(sb.toString()); //TODO 读取本地文件乱码问题 org.jsoup.nodes.Document doc1 = Jsoup.parse(sb.toString()); // org.jsoup.nodes.Document doc2 = Jsoup.parse(xml, "GBK"); System.out.println(doc1.toString()); // System.out.println(doc2.toString()); File tmp = new File(pdfPath); if (!tmp.getParentFile().exists()) tmp.getParentFile().mkdirs(); // System.out.println("-- created -in===" + tmp.getPath()); Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(tmp)); document.open(); // Connection conn = Jsoup.connect(jsp); // conn.header( // "User-Agent", // "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36"); // org.jsoup.nodes.Document doc = conn.timeout(5000).get(); // doc1.select("div#getpdf").remove(); InputStream in = new ByteArrayInputStream(doc1.toString().getBytes( "utf-8")); // System.out // .println("-- FileInputStreamFileInputStreamFileInputStreamFileInputStreamFileInputStreamFileInputStreamFileInputStreamFileInputStream"); XMLWorkerHelper.getInstance().parseXHtml(writer, document, in, Charset.forName("utf-8")); // System.out // .println("-- FileInputStreamFileInputStreamFileInputStreamFileInputStreamFileInputStreamFileInputStreamFileInputStreamFileInputStream"); document.close(); File out = new File(outPath); if (!out.getParentFile().exists()) out.getParentFile().mkdirs(); if (!out.exists()) out.createNewFile(); System.out.println("-- created -out===" + out.getPath()); PdfReader pdfReader = new PdfReader(tmp.getPath()); PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(out)); // PdfGState gs = new PdfGState(); base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); // base = BaseFont.createFont(fontPath, BaseFont.IDENTITY_H, // BaseFont.NOT_EMBEDDED); System.out.println("-- -fontPath===" + fontPath); if (base == null || pdfStamper == null) { msg = "文件生成失败!"; ActionContext.getContext().put("msg", msg); path = "error"; } // 设置透明度为0.4 gs.setFillOpacity(0.4f); gs.setStrokeOpacity(0.4f); int toPage = pdfStamper.getReader().getNumberOfPages(); for (int i = 1; i <= toPage; i++) { pageRect = pdfStamper.getReader().getPageSizeWithRotation(i); // 计算水印X,Y坐标 float x = pageRect.getWidth() / 2; float y = pageRect.getHeight() / 2; // 获得PDF最顶层 content = pdfStamper.getOverContent(i); content.saveState(); // set Transparency content.setGState(gs); content.beginText(); content.setColorFill(BaseColor.GRAY); content.setFontAndSize(base, 60); // 水印文字成45度角倾斜 content.showTextAligned(Element.ALIGN_CENTER, "eeeee", x, y, 45); content.endText(); } // pdfStamper.close(); // tmp.delete(); // path = jsp.split(contextPath)[0] + contextPath+"/"+ // out.getPath().replace("\\", // "/").split(contextPath)[1].split("/")[1]+"/"+out.getPath().replace("\\", // "/").split(contextPath)[1].split("/")[2]; path = out.getPath().replace("\\", "/").split("pdfOut")[0] + "pdfOut/$" + out.getPath().replace("\\", "/").split("pdfOut")[1] .split("/")[1]; System.out.println("-- created -pdf path===" + path); } catch (Exception ex) { ex.printStackTrace(); msg = "文件生成异常!"; ActionContext.getContext().put("msg", msg); path = "error"; } finally { content = null; base = null; pageRect = null; } return SUCCESS; }
java swing打开文件的程序,提示内存溢出
``` package newtest; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextArea; public class Test { public static void main(String[] args) { final Test test = new Test(); JFrame f= new JFrame(); JPanel p = new JPanel(); p.setLayout(new BorderLayout()); f.setContentPane(p); final JTextArea t = new JTextArea(); JButton b = new JButton("确定"); b.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { StringBuffer testyy = test.getFileContext("E:\\test.txt"); t.setText(testyy.toString()); } }); p.add(t, BorderLayout.CENTER); p.add(b, BorderLayout.SOUTH); f.setSize(200, 400); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } /** * 读取文件上下文 * @param filePath * 文件路径 * @return */ public StringBuffer getFileContext(String filePath) { StringBuffer fileContext = new StringBuffer(); if(filePath != null && !filePath.equals("")) { File file = new File(filePath); if(file.exists()) { if(file.isFile()) { BufferedReader bf = null; InputStreamReader isr = null; FileInputStream fis = null; try { fis = new FileInputStream(filePath); isr = new InputStreamReader(fis, "GBK"); bf = new BufferedReader(isr); String context = null; while ((context=bf.readLine()) != null) { fileContext.append(context); fileContext.append("\n"); } } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("获取文件上下文:文件"+filePath+"不支持编码格式"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("获取文件上下文:文件"+filePath+"未找到"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("获取文件上下文:文件"+filePath+"读取失败"); } finally { try { if(bf != null) { bf.close(); } if(isr != null) { isr.close(); } if(fis != null) { fis.close(); } } catch (IOException e) { e.printStackTrace(); } } } else { System.out.println("文件:"+filePath+"是文件夹无法读取"); } } else { System.out.println("文件:"+filePath+"不存在"); } } else { System.out.println("获取文件上下文:读取路径为空"); } return fileContext; } } ``` 打开上百兆文件直接提示内存溢出,我用2M小文件测试,用jvisualvm查看发现,内存占用最多的是char[] 和 JTextarea,试了好多方法还是不行,求大神帮帮忙,下图为2M小文件测试的结果: ![图片说明](https://img-ask.csdn.net/upload/201611/11/1478835148_651397.png) ![图片说明](https://img-ask.csdn.net/upload/201611/11/1478835464_164644.png)
Strus2中文下载的问题
<p><span style="font-size: small;">用Struts2解决中文下载问题的时候。发现网上大多数人用的是如下的代码: <br />(1) struts.xml配置 <br />&lt;action name="fileDownload" class="demo.struts2.action.FileDownload" method="download"&gt; <br />    &lt;result name="success" type="stream"&gt; <br />        <param name="contentType" />"${contentType}" <br />        <param name="inputName" />inputStream <br />        <param name="contentDisposition" />attachment;filename=<span style="color: #ff0000;"><strong>"${downloadFileName}"</strong></span> <br />        <param name="bufferSize" />4096 <br />    &lt;/result&gt; <br />    &lt;interceptor-ref name="defaultStack"&gt; &lt;/interceptor-ref&gt; <br />&lt;/action&gt; <br /><br /><br />(2) Action中的部分代码: <br />public String <strong><span style="color: #ff0000;">getDownloadFileName()</span> <br /></strong>{  <br />    // 省略try/catch <br />    String downFileName = this.fileName; <br />    <strong><span style="color: #ff0000;">downFileName = new String(downFileName.getBytes(), "ISO8859-1");</span> <br /></strong>    return downFileName; <br />} <br /><br /><br />为这里对编码转化这里有些疑惑哦~~ <br />downFileName = new String(downFileName.getBytes(), "ISO8859-1"); <br /><br />上面句活的含义不就是把 downFileName 按照本地编码(GBK)输出字节序列, <br />然后在将其按照 "ISO8859-1" 编码形式,进行“分割”操作。 <br /><br />问题就是在这里,如果是这样的话,客户端为什么会自动的把上面的内容(即:下载文件名自动识别出来的呢)</span></p>
SSH整合后Struts2上传功能失效
具体原因是Action中接不到值,但是将上传功能单独拿出来运行成功(不信自己拷贝代码来试),因此排除代码问题,整个项目的其他功能正常运行,在就是控制台没有报错信息,求教高手 问题出在哪里? 由于Strust.xml 中配置太多这里就只贴上传代码 [code="java"]<!-- 文件上传下载 --> <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <!-- 以下配置也可以在struts.properties中指定 --> <!-- 指定Struts2是否处于开发状态 --> <constant name="struts.devMode" value="true" /> <!-- 指定当struts2配置文件改变后,web框架是否重新加载struts2的配置文件 --> <constant name="struts.configuration.xml.reload" value="true" /> <!-- 指定需要Struts2处理的请求后缀,该属性的默认值是action --> <constant name="struts.action.extension" value="action,do" /> <!-- 指定Web应用的默认编码集。对于获取中文请求参数值,应该将该属性值设置为GBK或者GB2312。 --> <constant name="struts.i18n.encoding" value="UTF-8" /> <!-- 国际化全局资源文件名i18n --> <constant name="struts.custom.i18n.resources" value="globalMessages" /> <!-- 允许静态方法访问 --> <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> <!-- 文件上传 --> <constant name="struts.multipart.parser" value="jakarta" /> <package name="MyRole" extends="struts-default"> <action name="fileAction" class="com.role.action.fileAction"> <interceptor-ref name="fileUpload"> <!-- 为Action中的inputPath属性设值 --> <param name="inputPath">/upload</param> <!-- 配置允许上传的文件类型,多个用","分隔 --> <param name="allowedTypes"> image/bmp,image/png,image/gif,image/jpeg,image/pjpeg </param> <!-- 配置允许上传的文件大小,单位字节 --> <param name="maximumSize">1024008*8</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="basicStack"></interceptor-ref> <result name="input" type="redirect">/files.jsp</result> </action> </package> </struts>[/code] 这里是fileAction[code="java"]package com.role.action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class fileAction extends ActionSupport { //路径名 private String inputPath; private File photo; private String photoFileName; private String photoContentType; private String caption; public String getInputPath() { return inputPath; } public void setInputPath(String inputPath) { this.inputPath = inputPath; } public File getPhoto() { return photo; } public void setPhoto(File photo) { this.photo = photo; } public String getPhotoFileName() { return photoFileName; } public void setPhotoFileName(String photoFileName) { this.photoFileName = photoFileName; } public String getPhotoContentType() { return photoContentType; } public void setPhotoContentType(String photoContentType) { this.photoContentType = photoContentType; } public String getCaption() { return caption; } public void setCaption(String caption) { this.caption = caption; } public String execute() throws Exception { System.out.println("文件描述+++++++"+caption); if (photo != null) { System.out.println(photo.length()); System.out.println(photoFileName); FileInputStream fis = new FileInputStream(photo); String outfile = ServletActionContext.getServletContext() .getRealPath("/upload") + "/" + photoFileName; System.out.println(outfile); FileOutputStream fos = new FileOutputStream(outfile); byte[] bytes = new byte[2048 * 8]; int len; while ((len = fis.read(bytes)) != -1) { fos.write(bytes, 0, len); } fis.close(); fos.close(); } return "input"; } public String downFile()throws Exception{ return"downfile"; } /** * 下载 * @return * @throws Exception */ public InputStream getTargetFile() throws Exception{ return ServletActionContext.getServletContext(). getResourceAsStream("/upload"+photoFileName); } } [/code] 最后是JSP[code="java"]<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <s:form action="fileAction" method="post" theme="simple" enctype="multipart/form-data"> <!-- 测试文件上传 --> <s:file key="photo" label="图片文件"></s:file> <s:textfield key="caption" label="描述"></s:textfield> <s:submit value="测试按钮"></s:submit> </s:form> </body> </html> [/code] 下面是控制台仅有的信息 但是我感觉没多大关系的说,可是运行啦四次 无解- -[code="java"]文件描述+++++++null 06:21:19,729 INFO FileUploadInterceptor:31 - Removing file photo \tempUploadFile\upload__36291c3_12d7c4e8dd3__8000_00000002.tmp 06:21:19,736 INFO FileUploadInterceptor:31 - Removing file photo \tempUploadFile\upload__36291c3_12d7c4e8dd3__8000_00000002.tmp 06:21:19,736 INFO FileUploadInterceptor:31 - Removing file photo \tempUploadFile\upload__36291c3_12d7c4e8dd3__8000_00000002.tmp 06:21:19,737 INFO FileUploadInterceptor:31 - Removing file photo \tempUploadFile\upload__36291c3_12d7c4e8dd3__8000_00000002.tmp[/code]
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
【JSON解析】浅谈JSONObject的使用
简介 在程序开发过程中,在参数传递,函数返回值等方面,越来越多的使用JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,同时也易于机器解析和生成、易于理解、阅读和撰写,而且Json采用完全独立于语言的文本格式,这使得Json成为理想的数据交换语言。 JSON建构于两种结构: “名称/值”对的集合(A Collection of name/va...
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
Java 14 都快来了,为什么还有这么多人固守Java 8?
从Java 9开始,Java版本的发布就让人眼花缭乱了。每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份,...
达摩院十大科技趋势发布:2020 非同小可!
【CSDN编者按】1月2日,阿里巴巴发布《达摩院2020十大科技趋势》,十大科技趋势分别是:人工智能从感知智能向认知智能演进;计算存储一体化突破AI算力瓶颈;工业互联网的超融合;机器间大规模协作成为可能;模块化降低芯片设计门槛;规模化生产级区块链应用将走入大众;量子计算进入攻坚期;新材料推动半导体器件革新;保护数据隐私的AI技术将加速落地;云成为IT技术创新的中心 。 新的画卷,正在徐徐展开。...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
讲真,这两个IDE插件,可以让你写出质量杠杠的代码
周末躺在床上看《拯救大兵瑞恩》 周末在闲逛的时候,发现了两个优秀的 IDE 插件,据说可以提高代码的质量,我就安装了一下,试了试以后发现,确实很不错,就推荐给大家。 01、Alibaba Java 代码规范插件 《阿里巴巴 Java 开发手册》,相信大家都不会感到陌生,其 IDEA 插件的下载次数据说达到了 80 万次,我今天又贡献了一次。嘿嘿。 该项目的插件地址: https://github....
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
立即提问