分类目录:Java那些事

以下是与分类 “Java那些事” 相关联的文章

利用NIO,ByteBuffer处理TCP长连接数据粘包的问题

问题:TCP 长连接会发生数据粘包 原因:IP层对数据进行了分包发送(就是说这个与发送端无关,接收端必须处理) TCP长连接发送数据是以数据流的方式传输。当然也并不是将整个数据一次发送。当然程序里面就是write一次就足够了。然而这个会被IP层进行分包发送,这样意味着数据并不是一次能接受完的。如果数据量不大(1.3kb~1.4kb)就有可能一次收完,能否一次接受完毕主要看当时网络的MTU值。如果 ...

/

JAVA Linux下的验证码问题

JAVA Linux下的验证码问题

一般项目涉及到会员的时候就少不了需要验证码,项目放在Windows 可以正常的运行但是一旦把项目部署到Linux 触及到验证码的方法就会导致tomcat 直接停止运行。

这个问题百度大多答案都是千篇一律的,大多都是用到了awt把项目搞挂了。

/

java 编写网页爬虫程序(利用HttpClient+jsoup)

对于网页抓取这方面大家都知道百度和google 都是依靠这个起家的. 百度为广大的网名提供了很多便捷的地方.让大家能最快的找到自己的想要的东西.百度做的事情就是聚合互联网的信息资源(当然百度也有自己的信息平台,如百度文库,知道,贴吧这类的产品).那百度是怎样的抓取网站的呢.一般情况百度会有自己的链接库. 根据部分网站友链,外链.或者是网站管理员向百度提交网址的方式抓取网站A的内容. 百度的会根据网站A的情况派出蜘蛛(也有称爬虫的)去抓取网站A的内容.蜘蛛根据情况抓取网站A内容.百度根据自己的算法去组织抓取的内容. 然后你就能在百度中搜索到网站A的内容了.当然有时候可能不会第一页的. 这个就是百度核心了. 如何让用户第一时间找到自己想要的内容.

/

java socket(TCP)学习记录

        最近在 学习了socket 发现socket果然是个好东西. 仔细的去了解发现用途真的太多.通过scoket编写的东西能很好的做到各种兼容性.比如大家孰知的HTTP 协议了.sokcet通过一些同行协议就能就完成了HTTP . 想想就感觉好厉害呀.

        HTTP 这样强大的协议也不是在任何情况都是很有效的.如HTTP 需要实现长链接就显得有些力不从心了.HTTP 适合BS下的应用需要什么数据就从服务器请求什么数据.如果想要服务器主动找客户端的话就不是那样容易了.HTTP 基于请求的特点就无法完成服务端一主动找客户端(浏览器)

/

如何通过JAVA代码实现 批量改文件后缀

最近在改一套HTML模板 总是要改文件的后缀

但是手动改有些显得不太爽于是 就用java 实现了这个小小的功能。 方便以后自己使用

 

贴代码 开始

 


/**
  * 根据文件后缀 查找符合要求文件列表
  * @param path
  * @param prefix
  */
 private void getFilesByPrefix(String path,String prefix){
  File file[]=new File(path).listFiles();
  for(File f:file)
  {
   if(f.isDirectory() && new File(f.getAbsolutePath()).listFiles()!=null){
    getFilesByPrefix(f.getAbsolutePath(), prefix);
   }
   else{
    if(f.getAbsoluteFile().toString().endsWith(prefix)){
     fileList.add(f.getAbsoluteFile().toString());
    }
   }
  }
 }
 
 /** 外部调用 (根据文件后缀 查找符合要求文件列表) 并且检查传入的路径是否存在
  * @param path
  * @param prefix
  */
 public void updateFilesPrefix(String path,String oldPrefix,String nowPrefix){
  if (new File(path).isDirectory()) {
   getFilesByPrefix(path, oldPrefix);
  } 
  if(fileList.size()>0){
   for (String string : fileList) {
    String fileName=string.substring(0,string.lastIndexOf(".")+1);
    String newFileName=fileName+nowPrefix;
    System.out.println(newFileName);
    new File(string).renameTo(new File(newFileName));
   }
  }
 }
 
 
 public static void main(String[] args) {
  FilesManageUtil f=new FilesManageUtil();
  f.updateFilesPrefix("H:\\网页模板\\charisma-master\\charisma-master","jsp","html");
  
 }


 

/

按所有的文件夹在前的方式进行排序 - 处理java中使用遍历的文件下的内容

前几天遇到了这个问题。 发现遍历的文件夹和文件排列的顺序是乱的(按时间排序的)

于是想到了要自己去实现排序。 于是就在网上早了下代码。发现可以通过 Collections.sort

于是就想到了使用自己去重写 compare来实现排序。

下面是排序的代码。。

 

 public static void mysort(List<Files> files){
  Collections.sort(files, new Comparator<Files>()
  {
   public int compare(Files o1, Files o2) {
   
    //如果传进来的2个文件o1为文件夹 o2 不是文件时需要改变顺序
    if(o1.isFiler() && !o2.isFiler())
     return -1;
    //返回值>=0,则不调用Arrays.swap(Object x[], int a, int b) 方法。
    if(!o1.isFiler() && o2.isFiler())
           return 1;
    return 0;
   }
  });
 }

 

/

总结下几个数据库桥接 JDBC的URL

人难免会忘记 。 有时候少打个: 也要纠结半天

 

mysql --> jdbc:mysql://localhost:3306/blog[?useUnicode=true&characterEncoding=UTF-8&user=blog&password=xxxxx]  ?useUnicode=true&characterEncoding=UTF-8 可以避免一些应为mysql 安装时没有设置编码 带来的问题。  就这个有点想个网址 其他 oracle 的: sqlserver的 ; 还真给带来不少的疑惑

sql server --> jdbc:sqlserver://localhost:1433;databasename=jblog

 

sqlite --> jdbc:sqlite:/E:/1.db

 

oracle --> jdbc:oracle:thin:@localhost:1521:orcl

 

目前 接触过这4个数据库。

 

JDBC 是个好东西。

/

使用inputsteam 处理byte问题

byte b[] = new byte[1] ;

这个可以避免文件经过处理后文件变大的问题。 但是处理大文件时显得就相当吃力了。

于是new byte[1] 不是一个好的选择。

byte b[]=new byte[new File("E:/1.iso").length];

这个可以提高速度。 但是带来又一个问题就是。 这个一次性把文件写到缓存区。 对与小文件没有问题。 但是大文件。 恐怕就........

于是就想到了。我有针对的出来最后一次流的大小不就行了。

 

贴代码开始

public static void moveOrCopyFile(String src,String tag,boolean isMove){
  try {
   long s=System.currentTimeMillis();
   File f=new File(src);
   FileInputStream in=new FileInputStream(src);
   int fileSize=(int) f.length();
   byte b[]=null;
   new File(tag).createNewFile();
   FileOutputStream out=new FileOutputStream(tag);
   int cnt=fileSize/(1024*1024);
   //小于1M(大小根据自己的情况而定)的文件直接一次性写入。 
   if(cnt==0)
   {
    b=new byte[fileSize];
   }
   else
   {
    
    b=new byte[1024*1024];
    // 出来cnt次后 文件 跳出循环 
    while(in.read(b)!=-1)
    {
     out.write(b);
     if(--cnt==0)
     {
      break;
     }
     b=new byte[1024*1024];
    }
    //最后一次流的大小通过取模的方式得到
    b=new byte[fileSize%(1024*1024)];
   }
   //最后一次的文件写入
   in.read(b);
   out.write(b);
   // 一定要记得关闭流额。 不然其他程序那个文件无法进行操作
   in.close();
   out.close();
   System.out.println(System.currentTimeMillis()-s);
   if(isMove)
   {
    f.delete();
   }
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
  //System.out.println(src);
  //System.out.println(tag);
 }

 

外面递归移动或者拷贝文件的方法就不演示了。

 

/

Java 进行MD5的加密

package util;

import java.security.MessageDigest;

public class Md5Util {

 public final static String MD5(String pwd) {
  
  //用于加密的字符
  char md5String[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
    'A', 'B', 'C', 'D', 'E', 'F' };
  try {
   //使用平台的默认字符集将此 String 编码为 byte序列,并将结果存储到一个新的 byte数组中
   byte[] btInput = pwd.getBytes();
   
   // 获得指定摘要算法的 MessageDigest对象,此处为MD5
   //MessageDigest类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。
   //信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。 
   MessageDigest mdInst = MessageDigest.getInstance("MD5");
   //System.out.println(mdInst);  
   //MD5 Message Digest from SUN, <initialized>
   
   //MessageDigest对象通过使用 update方法处理数据, 使用指定的byte数组更新摘要
   mdInst.update(btInput);
   //System.out.println(mdInst);  
   //MD5 Message Digest from SUN, <in progress>
   
   // 摘要更新之后,通过调用digest()执行哈希计算,获得密文
   byte[] md = mdInst.digest();
   //System.out.println(md);
   
   // 把密文转换成十六进制的字符串形式
   int j = md.length;
   //System.out.println(j);
   char str[] = new char[j * 2];
   int k = 0;
   for (int i = 0; i < j; i++) {   //  i = 0
    byte byte0 = md[i];  //95
    str[k++] = md5String[byte0 >>> 4 & 0xf];    //    5  
    str[k++] = md5String[byte0 & 0xf];   //   F
   }
   //返回经过加密后的字符串
   return new String(str);
   
  } catch (Exception e) {
   e.printStackTrace();
   return null;
  }
 }
 public static void main(String[] args) {
  System.out.println(Md5Util.MD5("123456"));
  
 }
}



 

/