首页 文章 精选 留言 我的

精选列表

搜索[java],共10000篇文章
优秀的个人博客,低调大师

java随机流

当我们需要在指定位置读取文件,或者写入文件时,使用普通的流读写实现是比较麻烦的,jdk为我们提供了随机流api,可以让我们在任意位置读取或写入文件内容。 public class RandomStreamTest { public static void main(String[] args) throws Exception { randomWrite(); System.out.println(randomRead()); } public static void randomWrite() throws Exception{ RandomAccessFile write = new RandomAccessFile("E:\\1.txt","rw"); write.seek(0); write.write("hello".getBytes()); write.seek(6); write.write("world".getBytes()); write.close(); } public static String randomRead() throws Exception{ RandomAccessFile read = new RandomAccessFile("E:\\1.txt","r"); read.seek(6); byte[] buf = new byte[1024]; int len = read.read(buf); String str = new String(buf,0,len); read.close(); return str; } } 对于创建RandomAccessFiledui'xia对象,第二个参数共有4种: r:只读 rw:可读可写 rws:在rw的基础上,要求对文件的内容或元数据的修改同步到底层存储设备上 rwd:在rw的基础上,要求对文件的内容的修改同步到底层存储设备上 当我们对一个超大文件进行校验的时候,我们也可以使用随机流对文件进行分段读取操作。

优秀的个人博客,低调大师

Java ServletContext 详解

ServletContext是一个获取web应用信息的对象,我们可以通过HttpRequest对象来得到它: ServletContext context = request.getSession().getServletContext(); Context Attributes 就像session对象一样,你可以存储一些属性在servlet容器里。 context.setAttribute("someValue", "aValue"); 获取到属性 Object attribute = context.getAttribute("someValue"); 存储在ServletContext中的属性可用于应用程序中的所有Servlet以及request和session之间。 这意味着,这些属性可用于Web应用程序的所有访问者。 session属性仅供单个用户使用。 ServletContext属性仍然存储在servlet容器的内存中。 这就存在与服务器群集中的session属性相同的问题。

优秀的个人博客,低调大师

Java HttpRequest 详解

HttpServlet 类需要两个参数HttpRequest和HttpResponse。比如doGet方法 protected void doGet( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } 那我在这先介绍HttpRequest。 HttpRequest对象的目的是代替浏览器把Http请求发送给web应用,因此,任何浏览器能发送的,HttpRequest都可以接受到。 HttpRequest对象有很多方法,这里只介绍重要的,剩余的有兴趣的话你可以自己看JavaDoc。 参数 请求参数是从浏览器连同请求一起发送的参数。 请求参数通常作为URL的一部分(在“查询字符串”中)或作为HTTP请求主体的一部分发送。 例如: www.baidu.com?param1=hello&param2=world 在这个URL中,有两个参数 param1=hello param2=world 你可以用HttpRequest访问这些参数,例如: protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { String param1 = request.getParameter("param1"); String param2 = request.getParameter("param2"); } 通常,如果浏览器发送HTTP GET请求,则参数将包含在URL中的查询字符串中。 如果浏览器发送HTTP POST请求,则参数将包含在HTTP请求的正文部分(form)中。 请求头 请求头是浏览器伴随HttpRequest发送的的一个'键值对',请求标题包含关于例如 使用什么浏览器软件,浏览器能够接收哪些文件类型等等。 我们可以使用HttpRequest对象来接受请求头: String contentLength = request.getHeader("Content-Length"); Content-Length头包含在HTTP请求正文中发送的字节数,以防浏览器发送HTTP POST请求。 如果浏览器发送HTTP GET请求,则不使用Content-Length标头,并且上述代码将返回null。 输入流 如果浏览器发送HTTP POST请求,请求参数和其他潜在数据将发送到HTTP请求正文中的服务器。 它不一定是在HTTP请求主体中发送的请求参数。 它可能几乎是任何数据,如文件或SOAP请求(Web服务请求)。 为了可以访问HTTP POST请求的主题内容,我们可以用inputStream。这是一个例子: InputStream requestBodyInput = request.getInputStream(); 注意:在调用任何getParameter()方法之前,您必须调用此方法,因为在HTTP POST请求上调用getParameter()方法将导致servlet引擎 解析 HTTP请求主体 以 获取参数。 一旦分析完毕,就无法再以原始字节流的形式访问主体。 Session 也可以从HttpRequest对象获取Session对象。 Session对象可以在请求之间保存关于给定用户的信息。 因此,如果您在一个请求期间将对象设置为会话对象,则它可供您在同一会话时间范围内的任何后续请求和期间读取。 这里是如何获取Session对象: HttpSession session = request.getSession(); ServletContext 也可以从HttpRequest对象中获取ServletContext对象。ServletContext包含一些web应用信息。例如,能获取到web.xml文件里的一些参数,也能将request请求转发给别的Servlet,也能在ServletContext里存储一些应用参数。 这是获取ServletContext的例子: ServletContext context = request.getSession().getServletContext(); 可以看到,我们要先获取Session对象,再获取ServletContext。

优秀的个人博客,低调大师

Java HttpServlet 详解

javax.servlet.http.HttpServlet类是比Simple Servlet示例中显示的GenericServlet稍高级的基类。 HttpServlet类读取HTTP请求,并确定请求是否为HTTP GET,POST,PUT,DELETE,HEAD等,并调用一个相应的方法。 为了响应例如 仅HTTP GET请求,您将扩展HttpServlet类,并仅覆盖doGet()方法。 比如: public class SimpleHttpServlet extends HttpServlet { protected void doGet( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().write("<html><body>GET response</body></html>"); } } HttpServlet类也可以覆盖每个HTTP方法(GET,POST等)的方法。所有方法如下: doGet() doPost() doHead() doPut() doDelete() doOptions() doTrace() 大多数情况下,我们只想响应HTTP GET或POST请求,因此只需重写这两种方法。并且二者可以相互调用: public class SimpleHttpServlet extends HttpServlet { protected void doGet( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().write("GET/POST response"); } } 我们尽可能使用HttpServlet而不是GenericServlet。 HttpServlet比GenericServlet更容易使用,并且有更多的便捷方法。

优秀的个人博客,低调大师

Java HttpResponse 详解

HttpServlet 类需要两个参数HttpRequest和HttpResponse。比如doGet方法 protected void doGet( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } 我在这先介绍HttpResponse。 HttpResponse对象的目的是为了响应浏览器发送给Web应用程序的HTTP请求,表示Web应用程序发送回浏览器的HTTP响应。 HttpResponse对象有很多方法,我会介绍这里最常用的方法。如果你有兴趣其他方法你可以在JavaDoc中阅读。 Writing HTML 你能获取PrintWriter从HttpResponse对象中然后发送html到浏览器。这是个例子: PrintWriter writer = response.getWriter(); writer.write("<html><body>GET/POST response</body></html>"); Headers HttpRequest对象可以获取请求头,那么HttpResponse必须设置这些参数。例如: response.setHeader("Header-Name", "Header Value"); Content-Type 这个请求头是响应给浏览器说明发送的内容类型。例如,HTML的内容类型是text/html。例如: response.setHeader("Content-Type", "text/html"); 写文本 您可以编写文本回浏览器而不是HTML, response.setHeader("Content-Type", "text/plain"); PrintWriter writer = response.getWriter(); writer.write("This is just plain text"); Content-Length Content-Length告诉浏览器你的响应信息是多少个字节 response.setHeader("Content-Length", "31642"); 写二进制数据 你也能写二进制数据给浏览器,例如,你能发送一个图片、pdf文件等。 这样的话,contentType 应该是 image/png。 为了发送二进制数据,你就不能从response.gtWriter()方法中获取Writer了,因为它只是发送text类型的。 你能用OutputStream 从response.getOutputStream()方法中获取 输出流。例如: OutputStream outputStream = response.getOutputStream(); outputStream.write(...); URL重定向 你可以从servlet从其中重定向一个不同的URL发送给浏览器,当重定向的时候不能发送任何数据。例如: response.sendRedirect("http://www.baidu.com");

优秀的个人博客,低调大师

Java RequestDispatcher 详解

RequestDispatcher 让两个servlet相互通信成为可能,就像是浏览器发送request请求一样。所以我们可以从HttpRequest中获取到RequestDispatcher对象 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher dispatcher=request.getRequestDispatcher("/servlet2"); } 通过上面的代码,我们能获取到一个映射到/servlet2(URI) 的Servlet的 RequestDispatcher。 然后可以使用include()或者forward()方法来调用RequestDispatcher dispatcher.forward(request, response); dispatcher.include(request, response); request.getRequestDispatcher和response.sendRedirct区别 getRequestDispatcher是服务器内部跳转,地址栏信息不变,只能跳转到web应用内的网页。 sendRedirect是页面重定向,地址栏信息改变,可以跳转到任意网页。 getRequestDispatcher实例: request.setAttribute("lover", "fantj"); request.getSession().setAttribute("lovered", "fantj"); request.getRequestDispatcher("/third?name=fantj").forward(request, response); 或 request.getRequestDispatcher("third?name=fantj").forward(request, response); 或 this.getServletContext().getRequestDispatcher("/third?name=fantj").forward(request, response); //ThirdServlet PrintWriter out = response.getWriter(); String name = request.getParameter("name"); out.println(request.getContextPath()+"<hr/>"); out.println("name="+name+"<hr/>"); out.println("lover="+request.getAttribute("lover")+"<hr/>"); out.println("lovered="+request.getSession().getAttribute("lovered")+"<hr/>"); 结果显示,地址栏信息仍为http://localhost:8080/Test/second(不变),这三种方式都可以传值到第二个Servlet。 sendRedirct实例 //SecondServlet request.setAttribute("lover", "fantj"); request.getSession().setAttribute("lovered", "fantj"); response.sendRedirect("third?name=fantj"); 或 response.sendRedirect(request.getContextPath()+"/third?name=fantj"); //ThirdServlet PrintWriter out = response.getWriter(); String name = request.getParameter("name"); out.println(request.getContextPath()+"<hr/>"); out.println("name="+name+"<hr/>"); out.println("lover="+request.getAttribute("lover")+"<hr/>"); out.println("lovered="+request.getSession().getAttribute("lovered")+"<hr/>"); 结果显示,地址栏信息变为http://localhost:8080/Test/third?name=fantj(发生改变),只有request.getAttribute("lover")获取不到值,session范围及url路径后的传值在第二个Servlet都可以获取到值。 总结 其实我们好好想想,他们需要建立的对象不同,一个是request一个是response。 request处理可以想象成帮用户再补充一些请求(根据自己项目的业务逻辑),所以它应该要获取到所有request发送过来的数据,并且让用户感觉不到我们有帮他处理一些事情(因为地址栏信息不变)。 response可以说是响应给用户一个新的东西,它不会在意request给它发送了什么参数,除非request把数据写在同一个容器下的session中或者url中。这也是response.sendRedirct可以给用户返回容器以外的URL(比如www.baidu.com)的原因。

优秀的个人博客,低调大师

Java HttpSession 详解

HttpSession 是一个用户的session。session包含了用户信息。 当用户第一次访问网站时,有一个唯一的ID明确他的身份,这个ID保存在cookie或者一个请求参数里。 我们可以这样来获得session信息: protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); } 我们也可以保存这个session信息,以方便后面的读取。 session.setAttribute("userName", "theUserName"); 既然我们保存了session,那怎么获取保存的session呢? String userName = (String) session.getAttribute("userName"); 这些session是保存在servlet容器中。 session丢失问题处理 当我们的网站有多个不通的项目服务时,用户请求别的项目服务会存在session找不到的问题,有几个######解决办法: 不使用session。 将session保存到数据库,然后别的服务来获取。 用粘性的session,就是让用户的请求统一发到同一个服务器来处理。

优秀的个人博客,低调大师

JAVA 线程Join

join方法: 当某个线程要等待另一个线程执行结束后才能继续执行时,使用join方法。 public class DinnerThread { public static void main(String[] args){ DinnerThread thread = new DinnerThread(); Dinner fatherThread = thread.new Dinner(); Thread myThread = new Thread(fatherThread); myThread.start(); } public class Dinner implements Runnable { public void run() { System.out.println("去饭店吃饭"); System.out.println("点完菜让饭店做菜:"); Thread restaurantThread = new Thread(new RestaurantThread()); restaurantThread.start(); try { restaurantThread.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("开始吃饭"); } } public class RestaurantThread implements Runnable{ public void run() { System.out.println("饭店开始做菜"); for(int i=0;i<10;i++){ System.out.println("饭店做菜("+(i+1)+")..."); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("饭店上菜"); } } } 打印结果如下: 去饭店吃饭点完菜让饭店做菜:饭店开始做菜饭店做菜(1)...饭店做菜(2)...饭店做菜(3)...饭店做菜(4)...饭店做菜(5)...饭店做菜(6)...饭店做菜(7)...饭店做菜(8)...饭店做菜(9)...饭店做菜(10)...饭店上菜开始吃饭

优秀的个人博客,低调大师

分析Java AtomicInteger

为了解决多线程访问Integer变量导致结果不正确所设计的一个基于多线程并且支持原子操作的Integer类 AtomicInteger内部有一个变量UnSafe: Unsafe类是一个可以执行不安全、容易犯错的操作的一个特殊类 虽然Unsafe类中所有方法都是public的,但是这个类只能在一些被信任的代码中使用。 Unsafe类可以执行以下几种操作 分配内存,释放内存:在方法allocateMemory,reallocateMemory,freeMemory中,有点类似c中的malloc,free方法 可以定位对象的属性在内存中的位置,可以修改对象的属性值。使用objectFieldOffset方法 挂起和恢复线程,被封装在LockSupport类中供使用 AtomicInteger中用的就是Unsafe的CAS操作 Unsafe中的int类型的CAS操作方法 public final native boolean compareAndSwapInt(Object o, long offset,int expected,int x); 如果我把1这个数字属性更新到2的话,需要这样调用: compareAndSwapInt(this, valueOffset, 1, 2) valueOffset字段表示内存位置,可以在AtomicInteger对象中使用unsafe得到: ` value表示当前的整型值,这个整型变量还是volatile的,保证内存可见 AI内部还封装了一下CAS,定义了一个compareAndSet方法,只需要2个参数 addAndGet方法 内部使用一个死循环,先得到当前的值value,然后再把当前的值加一,加完之后使用cas原子操作让当前值加一处理正确。当然cas原子操作不一定是成功的,所以做了一个死循环,当cas操作成功的时候返回数据。这里由于使用了cas原子操作,所以不会出现多线程处理错误的问题。 比如线程A得到current为1,线程B也得到current为1 线程A的next值为2,进行cas操作并且成功的时候,将value修改成了2 这个时候线程B也得到next值为2,当进行cas操作的时候由于expected值已经是2,而不是1了 所以cas操作会失败,下一次循环的时候得到的current就变成了2 也就不会出现多线程处理问题了 incrementAndGet方法 跟addAndGet方法类似,只不过next值变成了current+1: getAndAdd方法 跟addAndGet方法一样,返回值变成了current: 缺点 虽然AtomicInteger中的cas操作可以实现非阻塞的原子操作,但是会产生ABA问题,

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。