目前分類:java (33)

瀏覽方式: 標題列表 簡短摘要

換行使用:<br/>

  /**
   * 抓取zip檔
   * @param fileName 檔案名稱
   * @return 處理結果 
   * <br/>msg: 內容
   * <br/>dir: 資料夾
   * @throws Exception
   */
public Rst process(String fileName) throws Exception {}

文章標籤

咪卡恰比 發表在 痞客邦 留言(0) 人氣()

Java 8 的 Stream API是對集合(Collection)功能的增強,能進行各種便利、高效的聚合操作(aggregate operation),或者數據操作。

同時提供順序流和並行流兩模式進行匯聚操作:

  • 並行模式:把一個內容分成多個數據塊,並用不同的線程分別處理每個數據塊的流(Fork/Join),能夠充分利用多核處理器的優勢。使用 fork/join 並行方式拆分任務和加速處理過程。
  • 順序模式:一個一個執行
  • 順序流的操作是在單線程上執行,而並行流的操作是在多線程上併發。
  • 並不是所有的問題都適合使用並行模式,考量要點:數據量、任務是否獨立、資料是否有順序
  • stream() − 為集合創建串行流;parallelStream() − 為集合創建並行流。

 Stream建構方法 

//基本數值型,目前有三種對應的包裝類型 Stream:IntStream、LongStream、DoubleStream ,可以直接套用增加效能

//Individual values
Stream stream = Stream.of("a", "b", "c");

// 2. Arrays
String [] strArray = new String[] {"a", "b", "c"};
Stream streamA = Stream.of(strArray);
Stream streamB = Arrays.stream(strArray);

IntStream.of(new int[]{1, 2, 3});
IntStream.range(1, 3);
IntStream.rangeClosed(1, 3);

// 3. Collections
List<String> list = Arrays.asList(strArray);
Stream stream = list.stream();

 Stream API操作類型 

  • intermediate operation( 中介操作 ):map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered。
    一個Stream後面可以跟隨0或多個操作,尚未真正開始Stream的遍歷,多個操作在 Terminal 操作的時候一次循環完成
  • terminal operations( 聚合操作 ):forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator,真正開始Stream的遍歷
  • Short-circuiting: anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limit

 filter:過濾,符合條件的留下 

List<String> strList = Arrays.asList("A", "B", "AA", "C");
List<String> strListAfter = strList.stream()
 .filter(x -> x.contains("A"))
 .collect(Collectors.toList());

 map:把 input Stream 的每一個元素,映射成 output Stream 的另外一個元素 

文章標籤

咪卡恰比 發表在 痞客邦 留言(0) 人氣()

ftp client和ftp server進行文件上傳會建立2條連接(control connectionsdata connections )

control connections : client 對server所下的任何指令 ( tcp/21 )

data connections:資料傳輸 (tcp/20)

client-server連線後保持著control connections等待要求,當需要傳輸檔案時,建立data connections,資料傳送完畢後釋放

控制連接:ftp命令交互

import org.apache.commons.net.ftp.FTPClient;

    FTPClient client = new FTPClient();
    /**
     * client和server的連線逾時時間
     */
    client.setConnectTimeout(connectTimeout);
    /**
     * 非處理資料總時間,data connections中socket阻塞未收到檔案的時間
     */
    client.setDataTimeout(timeout);
    /**
     * control connections數據讀取超時的時間
     * SoTimeout def.-set before connect() 
     */
    client.setDefaultTimeout(timeout);
    /**
     * control connections建立後,重新設置數據讀取超時時間
     * -set after connect() 
     */
    client.setSoTimeout(timeout);

 

文章標籤

咪卡恰比 發表在 痞客邦 留言(0) 人氣()

String array change to IntegerList

String[] arr = {'1', '2', '3'}
List<Integer> numList = Arrays.stream(arr )
            .map(Integer::parseInt)
            .collect(Collectors.toList());

文章標籤

咪卡恰比 發表在 痞客邦 留言(0) 人氣()

避免溢位計算

java.lang.Math;

Math.addExact(Long.MAX_VALUE-1L, 2L); //計算溢位

throw java.lang.ArithmeticException: long overflow




文章標籤

咪卡恰比 發表在 痞客邦 留言(0) 人氣()

try catch use:

if(e instanceof RestClientException && e.getCause() instanceof HttpMessageNotReadableException) {
        //TODO
 }

org.springframework.web.client.RestClientException: Error while extracting response for type [class com.test.res] and content type [application/json;charset=UTF-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null'); nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
 at [Source: (PushbackInputStream); line: 1, column: 2]

文章標籤

咪卡恰比 發表在 痞客邦 留言(0) 人氣()

解壓縮的時候發現

net.lingala.zip4j.ZipFile.isEncrypted() throws net.lingala.zip4j.exception.ZipException: Expected central directory entry not found (#1)

一路追發現主要是出錯在 at net.lingala.zip4j.headers.HeaderReader.readCentralDirectory(HeaderReader.java:168)
主要為檔案有異常

然後看到「ZIP4j 压缩与解压」https://blog.csdn.net/u011165335/article/details/50496930
這篇有提到

在添加文件时,发现只能添加一次,再次添加报错:Expected central directory entry not found (#1),

 

文章標籤

咪卡恰比 發表在 痞客邦 留言(0) 人氣()

@JsonFormat

  • 物件<->JSON 格式化互轉
  • 格式前端到後端、格式後端到前端
  • 資料交換如果以JSON交換,用此就可以了

@DateTimeFormat

  • spring mvc 格式前端到後端資料
  • 適用在form mapping

 

JSON傳值

{"testTimeA": "2020/08/26 18:42:12"}

後台設定物件

@lombok.Data
@ApiModel
public class testReq {

  @ApiModelProperty
  @JsonFormat(pattern = "yyyy/MM/dd HH:mm:ss", shape = JsonFormat.Shape.STRING, timezone = "GMT+8")
  private Date testTime;
}

==> 
back-end value:  testTime=Wed Aug 26 18:42:12 CST 2020

文章標籤

咪卡恰比 發表在 痞客邦 留言(0) 人氣()

table 複合主鍵 同時使用 JAXB annotation設定

  • 主pojo set @Id@IdClass(xxx.class)、並設定@XmlElement
/**
 *主檔
 */
@Entity
@lombok.Data
@lombok.ToString
@Table(name="STORE_INFO")
@XmlAccessorType(XmlAccessType.FIELD)
@IdClass(StoreInfoPK.class)
public class StoreInfo implements Serializable {

  private static final long serialVersionUID = 1L;
  
  @Id
  @XmlElement(name = "StoreId")
  private String storeId;
  
  @Id
  @XmlElement(name = "CreateTime")
  private Date createTime;

  /**
   * 店鋪店名
   */
  @XmlElement(name = "StoreName")
  @Column(name = "STORE_NAME")
  private String storeName;

  public SupStoreInfo() {}

}

table 複合主鍵 並用 JAXB annotation設定

  • PK pojo set @Column
/**
 *PK
 */

@lombok.Data
@lombok.ToString
public class StoreInfoPK implements Serializable {

  private static final long serialVersionUID = 1L;

    @Column(name="STORE_ID")
    private String storeId;

    @Column(name="CREATE_TIME")
    @Temporal(TemporalType.DATE)
    private Date createTime;
    
    public StoreInfoPK() {
    }
}

文章標籤

咪卡恰比 發表在 痞客邦 留言(0) 人氣()

 @Test
 public void tryremove() throws Exception {
    List<String> list = new ArrayList<String>();
    list.add("9");list.add("888");list.add("846");list.add("654");list.add("844");
    System.out.println("list: " + StringUtils.join(list, ","));
    
    if(CollectionUtils.isNotEmpty(list)){
      Iterator<String> it = list.iterator();
      while(it.hasNext()){
        String temp = it.next();
        System.out.println(temp);
        
        if(temp.startsWith("84")) {
          it.remove();
        }
      }
      
      System.out.println("list: " + StringUtils.join(list, ","));
    }
  }

//console:
list: 9,888,846,654,844
9
888
846
654
844
list: 9,888,654

文章標籤

咪卡恰比 發表在 痞客邦 留言(0) 人氣()

Returns an immutable collection containing only the specified object. The returned set is serializable.
/**
 * Set<T> java.util.Collections.singleton(T var0)
 * https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#singleton-T-
 */
Set<String> aa = Collections.singleton("AA");


/**
 * List<T> java.util.Collections.singletonList(T var0)
 * https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#singletonList-T-
 */
List<String> bb = Collections.singletonList("BB");


/**
 * Map<K, V> java.util.Collections.singletonMap(K var0, V var1)
 * https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#singletonMap-K-V-
 */
Map<String, String> cc = Collections.singletonMap("CCKey", "CCVal");

 

 

refer:

https://stackoverflow.com/questions/4801794/use-of-javas-collections-singletonlist
https://stackoverflow.com/questions/31599467/what-is-the-benefit-for-collections-singleton-to-return-a-set-instead-of-a-col
 


文章標籤

咪卡恰比 發表在 痞客邦 留言(0) 人氣()

org.apache.commons.lang3.exception.ExceptionUtils.ExceptionUtils.getStackTrace(Throwable)

 

ref:  https://stackoverflow.com/questions/1149703/how-can-i-convert-a-stack-trace-to-a-string


文章標籤

咪卡恰比 發表在 痞客邦 留言(0) 人氣()

import java.util.Random;  
public static void main(String[] args) {
    System.out.println(new Random().nextInt(90)+10); //86 (取10~99)
    System.out.println(new Random().nextInt(10));    //3  (取0~9)
    System.out.println(new Random().nextInt(9)+1);   //4  (取1~9)
    System.out.println(new Random().nextInt(2));     //1  (取0~9)
}

new Random().nextInt(n):取0~(n-1)之正整數

n需為正數

refer:  https://docs.oracle.com/javase/7/docs/api/java/util/Random.htm


文章標籤

咪卡恰比 發表在 痞客邦 留言(0) 人氣()

gson使用 @SerializedName

  @SerializedName("data")
  private String name;

 

jackson使用

  @JsonProperty("data")
  private String name;

 

REFER

https://www.javadoc.io/doc/com.google.code.gson/gson/2.6.2/com/google/gson/annotations/SerializedName.html

 

文章標籤

咪卡恰比 發表在 痞客邦 留言(0) 人氣()

序列和反序列設定,可以設定物件轉換模式

EX:

package com.bean.response;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;


@lombok.Data
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class Response {

  @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
        String message;
  
  @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
        String code;

}

refer:  http://fasterxml.github.io/jackson-annotations/javadoc/2.6/com/fasterxml/jackson/annotation/JsonProperty.Access.html


文章標籤

咪卡恰比 發表在 痞客邦 留言(0) 人氣()

HttpServletResponse.sendRedirect()

  • 使用相對地址會導到port80
  • 瀏覽器端工作,瀏覽器會出現重定向頁面的URL
  • url可帶參數

RequestDispatcher.forward()

  • 伺服器的內部機制
  • url不能帶參數 (可使用response.setAttribute)

refer:

https://ithelp.ithome.com.tw/articles/10185109


文章標籤

咪卡恰比 發表在 痞客邦 留言(0) 人氣()

public static <T> List<T> copyPropertiesList(List<?> src, Class<T> clazz) {
        if (CollectionUtils.isNotEmpty(src)) {
          Gson gson = new GsonBuilder().serializeNulls().create();
                
          List<T> lst = new ArrayList<>();
          
          JsonArray array = JsonParser.parseString(gson.toJson(src)).getAsJsonArray();
          for (JsonElement elem : array) {
                  lst.add(new Gson().fromJson(elem, clazz));
          }
          return lst;
          
        }else{
          return null;
        }
}

文章標籤

咪卡恰比 發表在 痞客邦 留言(0) 人氣()

  @Test
  public void StringToChar() throws Exception {
    String str = "14239626";
    
    for (int i = 0; i < str.length(); ++i) {
      int tmp = (str.charAt(i) - 48);
      System.out.print(tmp);  //14239626
    }
    
    for (int i = 0; i < str.length(); ++i) {
      int tmp2 = Integer.parseInt(String.valueOf(str.charAt(i)));
      System.out.print(tmp2); //14239626
    }
    
    for (int i = 0; i < str.length(); ++i) {
      int tmp3 = Character.getNumericValue(str.charAt(i));  //char 數字的NumericValue等於自己
      System.out.print(tmp3); //14239626
    }
    

    //Char("48")~Char("57") = 0~9
    //Char(0)~Char(9) = 48~57

    for (int i = 0; i < str.length(); ++i) {
      int tmp4 = (str.charAt(i));
      System.out.print(tmp4); //4952505157545054
    }
  }

文章標籤

咪卡恰比 發表在 痞客邦 留言(0) 人氣()

Method visibility and@Cacheable/@CachePut/@CacheEvict

When using proxies, you should apply the @Cache*annotations only to methods with public visibility.

If you do annotate protected, private or package-visible methods with these annotations, no error is raised, but the annotated method does not exhibit the configured caching settings. Consider the use of AspectJ (see below) if you need to annotate non-public methods as it changes the bytecode itself.

 

Ref : https://docs.spring.io/spring/docs/3.2.0.RC1/reference/html/cache.html

 


文章標籤

咪卡恰比 發表在 痞客邦 留言(0) 人氣()

java Data object 用 JSONObject.fromObject 或 JSONArray.fromObject做轉換的時候,
會轉成一個[ object object]的模式,如下:

"itemDateFrom":{"date":18,"hours":0,"seconds":0,"month":8,"nanos":0,"timezoneOffset":-480,"year":119,"minutes":0,"time":1568736000000,"day":3}

因為和預期 ( YYYY/MM/DD ) 不同,可以加入自定義轉換方式

  1. 先自定一個轉換定義
public class DateValue implements JsonValueProcessor{

        private String format ="yyyy/MM/dd";  
        
        public DateValue(){
                super();
        }
        
        public DateValue(String datePattern){
                super();  
        this.format = datePattern;
        }
        
        @Override
        public Object processArrayValue(Object value, JsonConfig config) {
                return process(value);
        }

        @Override
    public Object processObjectValue(String key, Object value, JsonConfig config) {   
        return process(value);   
    }
        
    private Object process(Object value){
        if(value instanceof Date){
                SimpleDateFormat sdf = new SimpleDateFormat(format);    
            return sdf.format(value); 
        }   
        return value == null ? "" : value.toString();   
    }
}
  1. 進行轉換
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(Date.class , new DateValue());
//jsonConfig.registerJsonValueProcessor(Date.class , new DateValue("yyyy-MM-dd"));
JSONArray.fromObject(rtnProductUsableVoList,jsonConfig);

 


文章標籤

咪卡恰比 發表在 痞客邦 留言(0) 人氣()

1 2